/*
	Copyright (c) 2009-2011, Stefan Webb.

	This file is part of SimpleML. Please read the file "license.txt", 
	which contains the conditions under which this software is distributed.
*/

/*!
	\file unicode.cpp
	\author Stefan Webb
	\brief Definition of Unicode class members.
*/

#include "stdafx.h"
#include "../double-conversion/double-conversion.h"

/* Create an object to allow access to the double-conversion library. */
// TODO: This shouldn't really be a global object...
// TODO: Should I put all of Unicode functions inside a class as static functions??
const int kBufferSize = 128;
utf8 utf8Buffer[kBufferSize];
utf16 utf16Buffer[kBufferSize];
int flags = DoubleToStringConverter::UNIQUE_ZERO | DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN;
DoubleToStringConverter dc(flags, "Inf", "NaN", 'e', -6, 21, 0, 0);
// TODO: Function for changing rounding mode. Would operate firstly on flags of dc object, secondly on which
// TODO: function is actually used from dc (i.e. ToShortest, ToFixed, or ToPrecision)
StringBuilder builder(buffer, kBufferSize);

/* Compare two UTF-8 strings. */
bool areEqual(utf8* first, utf8* second)
{
	return true;
}

/* Compare two UTF-16 strings. */
bool areEqual(utf16* first, utf16* second)
{
	return true;
}

/* Classifies a UTF-32 character into its general category. */
GeneralCategory classifyCharacter(utf32 c)
{
	// This code was generated automatically from "DerivedGeneralCategory.txt"
	// accessed at http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt
	// on 20-4-2009 using a Lua macro. There may well be a more efficient way of 
	// doing this, for example, with hashing functions.
	if ((c >= 0x0378 && c <= 0x0379) || (c >= 0x037F && c <= 0x0383) || (c == 0x038B) || (c == 0x038D) || (c == 0x03A2) || (c >= 0x0524 && c <= 0x0530) || (c >= 0x0557 && c <= 0x0558) || (c == 0x0560) || (c == 0x0588) || (c >= 0x058B && c <= 0x0590) || (c >= 0x05C8 && c <= 0x05CF) || (c >= 0x05EB && c <= 0x05EF) || (c >= 0x05F5 && c <= 0x05FF) || (c >= 0x0604 && c <= 0x0605) || (c >= 0x061C && c <= 0x061D) || (c == 0x0620) || (c == 0x065F) || (c == 0x070E) || (c >= 0x074B && c <= 0x074C) || (c >= 0x07B2 && c <= 0x07BF) || (c >= 0x07FB && c <= 0x0900) || (c >= 0x093A && c <= 0x093B) || (c >= 0x094E && c <= 0x094F) || (c >= 0x0955 && c <= 0x0957) || (c >= 0x0973 && c <= 0x097A) || (c == 0x0980) || (c == 0x0984) || (c >= 0x098D && c <= 0x098E) || (c >= 0x0991 && c <= 0x0992) || (c == 0x09A9) || (c == 0x09B1) || (c >= 0x09B3 && c <= 0x09B5) || (c >= 0x09BA && c <= 0x09BB) || (c >= 0x09C5 && c <= 0x09C6) || (c >= 0x09C9 && c <= 0x09CA) || (c >= 0x09CF && c <= 0x09D6) || (c >= 0x09D8 && c <= 0x09DB) || (c == 0x09DE) || (c >= 0x09E4 && c <= 0x09E5) || (c >= 0x09FB && c <= 0x0A00) || (c == 0x0A04) || (c >= 0x0A0B && c <= 0x0A0E) || (c >= 0x0A11 && c <= 0x0A12) || (c == 0x0A29) || (c == 0x0A31) || (c == 0x0A34) || (c == 0x0A37) || (c >= 0x0A3A && c <= 0x0A3B) || (c == 0x0A3D) || (c >= 0x0A43 && c <= 0x0A46) || (c >= 0x0A49 && c <= 0x0A4A) || (c >= 0x0A4E && c <= 0x0A50) || (c >= 0x0A52 && c <= 0x0A58) || (c == 0x0A5D) || (c >= 0x0A5F && c <= 0x0A65) || (c >= 0x0A76 && c <= 0x0A80) || (c == 0x0A84) || (c == 0x0A8E) || (c == 0x0A92) || (c == 0x0AA9) || (c == 0x0AB1) || (c == 0x0AB4) || (c >= 0x0ABA && c <= 0x0ABB) || (c == 0x0AC6) || (c == 0x0ACA) || (c >= 0x0ACE && c <= 0x0ACF) || (c >= 0x0AD1 && c <= 0x0ADF) || (c >= 0x0AE4 && c <= 0x0AE5) || (c == 0x0AF0) || (c >= 0x0AF2 && c <= 0x0B00) || (c == 0x0B04) || (c >= 0x0B0D && c <= 0x0B0E) || (c >= 0x0B11 && c <= 0x0B12) || (c == 0x0B29) || (c == 0x0B31) || (c == 0x0B34) || (c >= 0x0B3A && c <= 0x0B3B) || (c >= 0x0B45 && c <= 0x0B46) || (c >= 0x0B49 && c <= 0x0B4A) || (c >= 0x0B4E && c <= 0x0B55) || (c >= 0x0B58 && c <= 0x0B5B) || (c == 0x0B5E) || (c >= 0x0B64 && c <= 0x0B65) || (c >= 0x0B72 && c <= 0x0B81) || (c == 0x0B84) || (c >= 0x0B8B && c <= 0x0B8D) || (c == 0x0B91) || (c >= 0x0B96 && c <= 0x0B98) || (c == 0x0B9B) || (c == 0x0B9D) || (c >= 0x0BA0 && c <= 0x0BA2) || (c >= 0x0BA5 && c <= 0x0BA7) || (c >= 0x0BAB && c <= 0x0BAD) || (c >= 0x0BBA && c <= 0x0BBD) || (c >= 0x0BC3 && c <= 0x0BC5) || (c == 0x0BC9) || (c >= 0x0BCE && c <= 0x0BCF) || (c >= 0x0BD1 && c <= 0x0BD6) || (c >= 0x0BD8 && c <= 0x0BE5) || (c >= 0x0BFB && c <= 0x0C00) || (c == 0x0C04) || (c == 0x0C0D) || (c == 0x0C11) || (c == 0x0C29) || (c == 0x0C34) || (c >= 0x0C3A && c <= 0x0C3C) || (c == 0x0C45) || (c == 0x0C49) || (c >= 0x0C4E && c <= 0x0C54) || (c == 0x0C57) || (c >= 0x0C5A && c <= 0x0C5F) || (c >= 0x0C64 && c <= 0x0C65) || (c >= 0x0C70 && c <= 0x0C77) || (c >= 0x0C80 && c <= 0x0C81) || (c == 0x0C84) || (c == 0x0C8D) || (c == 0x0C91) || (c == 0x0CA9) || (c == 0x0CB4) || (c >= 0x0CBA && c <= 0x0CBB) || (c == 0x0CC5) || (c == 0x0CC9) || (c >= 0x0CCE && c <= 0x0CD4) || (c >= 0x0CD7 && c <= 0x0CDD) || (c == 0x0CDF) || (c >= 0x0CE4 && c <= 0x0CE5) || (c == 0x0CF0) || (c >= 0x0CF3 && c <= 0x0D01) || (c == 0x0D04) || (c == 0x0D0D) || (c == 0x0D11) || (c == 0x0D29) || (c >= 0x0D3A && c <= 0x0D3C) || (c == 0x0D45) || (c == 0x0D49) || (c >= 0x0D4E && c <= 0x0D56) || (c >= 0x0D58 && c <= 0x0D5F) || (c >= 0x0D64 && c <= 0x0D65) || (c >= 0x0D76 && c <= 0x0D78) || (c >= 0x0D80 && c <= 0x0D81) || (c == 0x0D84) || (c >= 0x0D97 && c <= 0x0D99) || (c == 0x0DB2) || (c == 0x0DBC) || (c >= 0x0DBE && c <= 0x0DBF) || (c >= 0x0DC7 && c <= 0x0DC9) || (c >= 0x0DCB && c <= 0x0DCE) || (c == 0x0DD5) || (c == 0x0DD7) || (c >= 0x0DE0 && c <= 0x0DF1) || (c >= 0x0DF5 && c <= 0x0E00) || (c >= 0x0E3B && c <= 0x0E3E) || (c >= 0x0E5C && c <= 0x0E80) || (c == 0x0E83) || (c >= 0x0E85 && c <= 0x0E86) || (c == 0x0E89) || (c >= 0x0E8B && c <= 0x0E8C) || (c >= 0x0E8E && c <= 0x0E93) || (c == 0x0E98) || (c == 0x0EA0) || (c == 0x0EA4) || (c == 0x0EA6) || (c >= 0x0EA8 && c <= 0x0EA9) || (c == 0x0EAC) || (c == 0x0EBA) || (c >= 0x0EBE && c <= 0x0EBF) || (c == 0x0EC5) || (c == 0x0EC7) || (c >= 0x0ECE && c <= 0x0ECF) || (c >= 0x0EDA && c <= 0x0EDB) || (c >= 0x0EDE && c <= 0x0EFF) || (c == 0x0F48) || (c >= 0x0F6D && c <= 0x0F70) || (c >= 0x0F8C && c <= 0x0F8F) || (c == 0x0F98) || (c == 0x0FBD) || (c == 0x0FCD) || (c >= 0x0FD5 && c <= 0x0FFF) || (c >= 0x109A && c <= 0x109D) || (c >= 0x10C6 && c <= 0x10CF) || (c >= 0x10FD && c <= 0x10FF) || (c >= 0x115A && c <= 0x115E) || (c >= 0x11A3 && c <= 0x11A7) || (c >= 0x11FA && c <= 0x11FF) || (c == 0x1249) || (c >= 0x124E && c <= 0x124F) || (c == 0x1257) || (c == 0x1259) || (c >= 0x125E && c <= 0x125F) || (c == 0x1289) || (c >= 0x128E && c <= 0x128F) || (c == 0x12B1) || (c >= 0x12B6 && c <= 0x12B7) || (c == 0x12BF) || (c == 0x12C1) || (c >= 0x12C6 && c <= 0x12C7) || (c == 0x12D7) || (c == 0x1311) || (c >= 0x1316 && c <= 0x1317) || (c >= 0x135B && c <= 0x135E) || (c >= 0x137D && c <= 0x137F) || (c >= 0x139A && c <= 0x139F) || (c >= 0x13F5 && c <= 0x1400) || (c >= 0x1677 && c <= 0x167F) || (c >= 0x169D && c <= 0x169F) || (c >= 0x16F1 && c <= 0x16FF) || (c == 0x170D) || (c >= 0x1715 && c <= 0x171F) || (c >= 0x1737 && c <= 0x173F) || (c >= 0x1754 && c <= 0x175F) || (c == 0x176D) || (c == 0x1771) || (c >= 0x1774 && c <= 0x177F) || (c >= 0x17DE && c <= 0x17DF) || (c >= 0x17EA && c <= 0x17EF) || (c >= 0x17FA && c <= 0x17FF) || (c == 0x180F) || (c >= 0x181A && c <= 0x181F) || (c >= 0x1878 && c <= 0x187F) || (c >= 0x18AB && c <= 0x18FF) || (c >= 0x191D && c <= 0x191F) || (c >= 0x192C && c <= 0x192F) || (c >= 0x193C && c <= 0x193F) || (c >= 0x1941 && c <= 0x1943) || (c >= 0x196E && c <= 0x196F) || (c >= 0x1975 && c <= 0x197F) || (c >= 0x19AA && c <= 0x19AF) || (c >= 0x19CA && c <= 0x19CF) || (c >= 0x19DA && c <= 0x19DD) || (c >= 0x1A1C && c <= 0x1A1D) || (c >= 0x1A20 && c <= 0x1AFF) || (c >= 0x1B4C && c <= 0x1B4F) || (c >= 0x1B7D && c <= 0x1B7F) || (c >= 0x1BAB && c <= 0x1BAD) || (c >= 0x1BBA && c <= 0x1BFF) || (c >= 0x1C38 && c <= 0x1C3A) || (c >= 0x1C4A && c <= 0x1C4C) || (c >= 0x1C80 && c <= 0x1CFF) || (c >= 0x1DE7 && c <= 0x1DFD) || (c >= 0x1F16 && c <= 0x1F17) || (c >= 0x1F1E && c <= 0x1F1F) || (c >= 0x1F46 && c <= 0x1F47) || (c >= 0x1F4E && c <= 0x1F4F) || (c == 0x1F58) || (c == 0x1F5A) || (c == 0x1F5C) || (c == 0x1F5E) || (c >= 0x1F7E && c <= 0x1F7F) || (c == 0x1FB5) || (c == 0x1FC5) || (c >= 0x1FD4 && c <= 0x1FD5) || (c == 0x1FDC) || (c >= 0x1FF0 && c <= 0x1FF1) || (c == 0x1FF5) || (c == 0x1FFF) || (c >= 0x2065 && c <= 0x2069) || (c >= 0x2072 && c <= 0x2073) || (c == 0x208F) || (c >= 0x2095 && c <= 0x209F) || (c >= 0x20B6 && c <= 0x20CF) || (c >= 0x20F1 && c <= 0x20FF) || (c >= 0x2150 && c <= 0x2152) || (c >= 0x2189 && c <= 0x218F) || (c >= 0x23E8 && c <= 0x23FF) || (c >= 0x2427 && c <= 0x243F) || (c >= 0x244B && c <= 0x245F) || (c >= 0x269E && c <= 0x269F) || (c >= 0x26BD && c <= 0x26BF) || (c >= 0x26C4 && c <= 0x2700) || (c == 0x2705) || (c >= 0x270A && c <= 0x270B) || (c == 0x2728) || (c == 0x274C) || (c == 0x274E) || (c >= 0x2753 && c <= 0x2755) || (c == 0x2757) || (c >= 0x275F && c <= 0x2760) || (c >= 0x2795 && c <= 0x2797) || (c == 0x27B0) || (c == 0x27BF) || (c == 0x27CB) || (c >= 0x27CD && c <= 0x27CF) || (c >= 0x2B4D && c <= 0x2B4F) || (c >= 0x2B55 && c <= 0x2BFF) || (c == 0x2C2F) || (c == 0x2C5F) || (c == 0x2C70) || (c >= 0x2C7E && c <= 0x2C7F) || (c >= 0x2CEB && c <= 0x2CF8) || (c >= 0x2D26 && c <= 0x2D2F) || (c >= 0x2D66 && c <= 0x2D6E) || (c >= 0x2D70 && c <= 0x2D7F) || (c >= 0x2D97 && c <= 0x2D9F) || (c == 0x2DA7) || (c == 0x2DAF) || (c == 0x2DB7) || (c == 0x2DBF) || (c == 0x2DC7) || (c == 0x2DCF) || (c == 0x2DD7) || (c == 0x2DDF) || (c >= 0x2E31 && c <= 0x2E7F) || (c == 0x2E9A) || (c >= 0x2EF4 && c <= 0x2EFF) || (c >= 0x2FD6 && c <= 0x2FEF) || (c >= 0x2FFC && c <= 0x2FFF) || (c == 0x3040) || (c >= 0x3097 && c <= 0x3098) || (c >= 0x3100 && c <= 0x3104) || (c >= 0x312E && c <= 0x3130) || (c == 0x318F) || (c >= 0x31B8 && c <= 0x31BF) || (c >= 0x31E4 && c <= 0x31EF) || (c == 0x321F) || (c >= 0x3244 && c <= 0x324F) || (c == 0x32FF) || (c >= 0x4DB6 && c <= 0x4DBF) || (c >= 0x9FC4 && c <= 0x9FFF) || (c >= 0xA48D && c <= 0xA48F) || (c >= 0xA4C7 && c <= 0xA4FF) || (c >= 0xA62C && c <= 0xA63F) || (c >= 0xA660 && c <= 0xA661) || (c >= 0xA674 && c <= 0xA67B) || (c >= 0xA698 && c <= 0xA6FF) || (c >= 0xA78D && c <= 0xA7FA) || (c >= 0xA82C && c <= 0xA83F) || (c >= 0xA878 && c <= 0xA87F) || (c >= 0xA8C5 && c <= 0xA8CD) || (c >= 0xA8DA && c <= 0xA8FF) || (c >= 0xA954 && c <= 0xA95E) || (c >= 0xA960 && c <= 0xA9FF) || (c >= 0xAA37 && c <= 0xAA3F) || (c >= 0xAA4E && c <= 0xAA4F) || (c >= 0xAA5A && c <= 0xAA5B) || (c >= 0xAA60 && c <= 0xABFF) || (c >= 0xD7A4 && c <= 0xD7FF) || (c >= 0xFA2E && c <= 0xFA2F) || (c >= 0xFA6B && c <= 0xFA6F) || (c >= 0xFADA && c <= 0xFAFF) || (c >= 0xFB07 && c <= 0xFB12) || (c >= 0xFB18 && c <= 0xFB1C) || (c == 0xFB37) || (c == 0xFB3D) || (c == 0xFB3F) || (c == 0xFB42) || (c == 0xFB45) || (c >= 0xFBB2 && c <= 0xFBD2) || (c >= 0xFD40 && c <= 0xFD4F) || (c >= 0xFD90 && c <= 0xFD91) || (c >= 0xFDC8 && c <= 0xFDEF) || (c >= 0xFDFE && c <= 0xFDFF) || (c >= 0xFE1A && c <= 0xFE1F) || (c >= 0xFE27 && c <= 0xFE2F) || (c == 0xFE53) || (c == 0xFE67) || (c >= 0xFE6C && c <= 0xFE6F) || (c == 0xFE75) || (c >= 0xFEFD && c <= 0xFEFE) || (c == 0xFF00) || (c >= 0xFFBF && c <= 0xFFC1) || (c >= 0xFFC8 && c <= 0xFFC9) || (c >= 0xFFD0 && c <= 0xFFD1) || (c >= 0xFFD8 && c <= 0xFFD9) || (c >= 0xFFDD && c <= 0xFFDF) || (c == 0xFFE7) || (c >= 0xFFEF && c <= 0xFFF8) || (c >= 0xFFFE && c <= 0xFFFF) || (c == 0x1000C) || (c == 0x10027) || (c == 0x1003B) || (c == 0x1003E) || (c >= 0x1004E && c <= 0x1004F) || (c >= 0x1005E && c <= 0x1007F) || (c >= 0x100FB && c <= 0x100FF) || (c >= 0x10103 && c <= 0x10106) || (c >= 0x10134 && c <= 0x10136) || (c >= 0x1018B && c <= 0x1018F) || (c >= 0x1019C && c <= 0x101CF) || (c >= 0x101FE && c <= 0x1027F) || (c >= 0x1029D && c <= 0x1029F) || (c >= 0x102D1 && c <= 0x102FF) || (c == 0x1031F) || (c >= 0x10324 && c <= 0x1032F) || (c >= 0x1034B && c <= 0x1037F) || (c == 0x1039E) || (c >= 0x103C4 && c <= 0x103C7) || (c >= 0x103D6 && c <= 0x103FF) || (c >= 0x1049E && c <= 0x1049F) || (c >= 0x104AA && c <= 0x107FF) || (c >= 0x10806 && c <= 0x10807) || (c == 0x10809) || (c == 0x10836) || (c >= 0x10839 && c <= 0x1083B) || (c >= 0x1083D && c <= 0x1083E) || (c >= 0x10840 && c <= 0x108FF) || (c >= 0x1091A && c <= 0x1091E) || (c >= 0x1093A && c <= 0x1093E) || (c >= 0x10940 && c <= 0x109FF) || (c == 0x10A04) || (c >= 0x10A07 && c <= 0x10A0B) || (c == 0x10A14) || (c == 0x10A18) || (c >= 0x10A34 && c <= 0x10A37) || (c >= 0x10A3B && c <= 0x10A3E) || (c >= 0x10A48 && c <= 0x10A4F) || (c >= 0x10A59 && c <= 0x11FFF) || (c >= 0x1236F && c <= 0x123FF) || (c >= 0x12463 && c <= 0x1246F) || (c >= 0x12474 && c <= 0x1CFFF) || (c >= 0x1D0F6 && c <= 0x1D0FF) || (c >= 0x1D127 && c <= 0x1D128) || (c >= 0x1D1DE && c <= 0x1D1FF) || (c >= 0x1D246 && c <= 0x1D2FF) || (c >= 0x1D357 && c <= 0x1D35F) || (c >= 0x1D372 && c <= 0x1D3FF) || (c == 0x1D455) || (c == 0x1D49D) || (c >= 0x1D4A0 && c <= 0x1D4A1) || (c >= 0x1D4A3 && c <= 0x1D4A4) || (c >= 0x1D4A7 && c <= 0x1D4A8) || (c == 0x1D4AD) || (c == 0x1D4BA) || (c == 0x1D4BC) || (c == 0x1D4C4) || (c == 0x1D506) || (c >= 0x1D50B && c <= 0x1D50C) || (c == 0x1D515) || (c == 0x1D51D) || (c == 0x1D53A) || (c == 0x1D53F) || (c == 0x1D545) || (c >= 0x1D547 && c <= 0x1D549) || (c == 0x1D551) || (c >= 0x1D6A6 && c <= 0x1D6A7) || (c >= 0x1D7CC && c <= 0x1D7CD) || (c >= 0x1D800 && c <= 0x1EFFF) || (c >= 0x1F02C && c <= 0x1F02F) || (c >= 0x1F094 && c <= 0x1FFFF) || (c >= 0x2A6D7 && c <= 0x2F7FF) || (c >= 0x2FA1E && c <= 0xE0000) || (c >= 0xE0002 && c <= 0xE001F) || (c >= 0xE0080 && c <= 0xE00FF) || (c >= 0xE01F0 && c <= 0xEFFFF) || (c >= 0xFFFFE && c <= 0xFFFFF) || (c >= 0x10FFFE && c <= 0x10FFFF)) 
		return CN;
	else if ((c >= 0xE000 && c <= 0xF8FF) || (c >= 0xF0000 && c <= 0xFFFFD) || (c >= 0x100000 && c <= 0x10FFFD)) 
		return CO;
	else if ((c >= 0x0300 && c <= 0x036F) || (c >= 0x0483 && c <= 0x0487) || (c >= 0x0591 && c <= 0x05BD) || (c == 0x05BF) || (c >= 0x05C1 && c <= 0x05C2) || (c >= 0x05C4 && c <= 0x05C5) || (c == 0x05C7) || (c >= 0x0610 && c <= 0x061A) || (c >= 0x064B && c <= 0x065E) || (c == 0x0670) || (c >= 0x06D6 && c <= 0x06DC) || (c >= 0x06DF && c <= 0x06E4) || (c >= 0x06E7 && c <= 0x06E8) || (c >= 0x06EA && c <= 0x06ED) || (c == 0x0711) || (c >= 0x0730 && c <= 0x074A) || (c >= 0x07A6 && c <= 0x07B0) || (c >= 0x07EB && c <= 0x07F3) || (c >= 0x0901 && c <= 0x0902) || (c == 0x093C) || (c >= 0x0941 && c <= 0x0948) || (c == 0x094D) || (c >= 0x0951 && c <= 0x0954) || (c >= 0x0962 && c <= 0x0963) || (c == 0x0981) || (c == 0x09BC) || (c >= 0x09C1 && c <= 0x09C4) || (c == 0x09CD) || (c >= 0x09E2 && c <= 0x09E3) || (c >= 0x0A01 && c <= 0x0A02) || (c == 0x0A3C) || (c >= 0x0A41 && c <= 0x0A42) || (c >= 0x0A47 && c <= 0x0A48) || (c >= 0x0A4B && c <= 0x0A4D) || (c == 0x0A51) || (c >= 0x0A70 && c <= 0x0A71) || (c == 0x0A75) || (c >= 0x0A81 && c <= 0x0A82) || (c == 0x0ABC) || (c >= 0x0AC1 && c <= 0x0AC5) || (c >= 0x0AC7 && c <= 0x0AC8) || (c == 0x0ACD) || (c >= 0x0AE2 && c <= 0x0AE3) || (c == 0x0B01) || (c == 0x0B3C) || (c == 0x0B3F) || (c >= 0x0B41 && c <= 0x0B44) || (c == 0x0B4D) || (c == 0x0B56) || (c >= 0x0B62 && c <= 0x0B63) || (c == 0x0B82) || (c == 0x0BC0) || (c == 0x0BCD) || (c >= 0x0C3E && c <= 0x0C40) || (c >= 0x0C46 && c <= 0x0C48) || (c >= 0x0C4A && c <= 0x0C4D) || (c >= 0x0C55 && c <= 0x0C56) || (c >= 0x0C62 && c <= 0x0C63) || (c == 0x0CBC) || (c == 0x0CBF) || (c == 0x0CC6) || (c >= 0x0CCC && c <= 0x0CCD) || (c >= 0x0CE2 && c <= 0x0CE3) || (c >= 0x0D41 && c <= 0x0D44) || (c == 0x0D4D) || (c >= 0x0D62 && c <= 0x0D63) || (c == 0x0DCA) || (c >= 0x0DD2 && c <= 0x0DD4) || (c == 0x0DD6) || (c == 0x0E31) || (c >= 0x0E34 && c <= 0x0E3A) || (c >= 0x0E47 && c <= 0x0E4E) || (c == 0x0EB1) || (c >= 0x0EB4 && c <= 0x0EB9) || (c >= 0x0EBB && c <= 0x0EBC) || (c >= 0x0EC8 && c <= 0x0ECD) || (c >= 0x0F18 && c <= 0x0F19) || (c == 0x0F35) || (c == 0x0F37) || (c == 0x0F39) || (c >= 0x0F71 && c <= 0x0F7E) || (c >= 0x0F80 && c <= 0x0F84) || (c >= 0x0F86 && c <= 0x0F87) || (c >= 0x0F90 && c <= 0x0F97) || (c >= 0x0F99 && c <= 0x0FBC) || (c == 0x0FC6) || (c >= 0x102D && c <= 0x1030) || (c >= 0x1032 && c <= 0x1037) || (c >= 0x1039 && c <= 0x103A) || (c >= 0x103D && c <= 0x103E) || (c >= 0x1058 && c <= 0x1059) || (c >= 0x105E && c <= 0x1060) || (c >= 0x1071 && c <= 0x1074) || (c == 0x1082) || (c >= 0x1085 && c <= 0x1086) || (c == 0x108D) || (c == 0x135F) || (c >= 0x1712 && c <= 0x1714) || (c >= 0x1732 && c <= 0x1734) || (c >= 0x1752 && c <= 0x1753) || (c >= 0x1772 && c <= 0x1773) || (c >= 0x17B7 && c <= 0x17BD) || (c == 0x17C6) || (c >= 0x17C9 && c <= 0x17D3) || (c == 0x17DD) || (c >= 0x180B && c <= 0x180D) || (c == 0x18A9) || (c >= 0x1920 && c <= 0x1922) || (c >= 0x1927 && c <= 0x1928) || (c == 0x1932) || (c >= 0x1939 && c <= 0x193B) || (c >= 0x1A17 && c <= 0x1A18) || (c >= 0x1B00 && c <= 0x1B03) || (c == 0x1B34) || (c >= 0x1B36 && c <= 0x1B3A) || (c == 0x1B3C) || (c == 0x1B42) || (c >= 0x1B6B && c <= 0x1B73) || (c >= 0x1B80 && c <= 0x1B81) || (c >= 0x1BA2 && c <= 0x1BA5) || (c >= 0x1BA8 && c <= 0x1BA9) || (c >= 0x1C2C && c <= 0x1C33) || (c >= 0x1C36 && c <= 0x1C37) || (c >= 0x1DC0 && c <= 0x1DE6) || (c >= 0x1DFE && c <= 0x1DFF) || (c >= 0x20D0 && c <= 0x20DC) || (c == 0x20E1) || (c >= 0x20E5 && c <= 0x20F0) || (c >= 0x2DE0 && c <= 0x2DFF) || (c >= 0x302A && c <= 0x302F) || (c >= 0x3099 && c <= 0x309A) || (c == 0xA66F) || (c >= 0xA67C && c <= 0xA67D) || (c == 0xA802) || (c == 0xA806) || (c == 0xA80B) || (c >= 0xA825 && c <= 0xA826) || (c == 0xA8C4) || (c >= 0xA926 && c <= 0xA92D) || (c >= 0xA947 && c <= 0xA951) || (c >= 0xAA29 && c <= 0xAA2E) || (c >= 0xAA31 && c <= 0xAA32) || (c >= 0xAA35 && c <= 0xAA36) || (c == 0xAA43) || (c == 0xAA4C) || (c == 0xFB1E) || (c >= 0xFE00 && c <= 0xFE0F) || (c >= 0xFE20 && c <= 0xFE26) || (c == 0x101FD) || (c >= 0x10A01 && c <= 0x10A03) || (c >= 0x10A05 && c <= 0x10A06) || (c >= 0x10A0C && c <= 0x10A0F) || (c >= 0x10A38 && c <= 0x10A3A) || (c == 0x10A3F) || (c >= 0x1D167 && c <= 0x1D169) || (c >= 0x1D17B && c <= 0x1D182) || (c >= 0x1D185 && c <= 0x1D18B) || (c >= 0x1D1AA && c <= 0x1D1AD) || (c >= 0x1D242 && c <= 0x1D244) || (c >= 0xE0100 && c <= 0xE01EF)) 
		return MN;
	else if ((c == 0x00AB) || (c == 0x2018) || (c >= 0x201B && c <= 0x201C) || (c == 0x201F) || (c == 0x2039) || (c == 0x2E02) || (c == 0x2E04) || (c == 0x2E09) || (c == 0x2E0C) || (c == 0x2E1C) || (c == 0x2E20)) 
		return PI;
	else if ((c == 0x0029) || (c == 0x005D) || (c == 0x007D) || (c == 0x0F3B) || (c == 0x0F3D) || (c == 0x169C) || (c == 0x2046) || (c == 0x207E) || (c == 0x208E) || (c == 0x232A) || (c == 0x2769) || (c == 0x276B) || (c == 0x276D) || (c == 0x276F) || (c == 0x2771) || (c == 0x2773) || (c == 0x2775) || (c == 0x27C6) || (c == 0x27E7) || (c == 0x27E9) || (c == 0x27EB) || (c == 0x27ED) || (c == 0x27EF) || (c == 0x2984) || (c == 0x2986) || (c == 0x2988) || (c == 0x298A) || (c == 0x298C) || (c == 0x298E) || (c == 0x2990) || (c == 0x2992) || (c == 0x2994) || (c == 0x2996) || (c == 0x2998) || (c == 0x29D9) || (c == 0x29DB) || (c == 0x29FD) || (c == 0x2E23) || (c == 0x2E25) || (c == 0x2E27) || (c == 0x2E29) || (c == 0x3009) || (c == 0x300B) || (c == 0x300D) || (c == 0x300F) || (c == 0x3011) || (c == 0x3015) || (c == 0x3017) || (c == 0x3019) || (c == 0x301B) || (c >= 0x301E && c <= 0x301F) || (c == 0xFD3F) || (c == 0xFE18) || (c == 0xFE36) || (c == 0xFE38) || (c == 0xFE3A) || (c == 0xFE3C) || (c == 0xFE3E) || (c == 0xFE40) || (c == 0xFE42) || (c == 0xFE44) || (c == 0xFE48) || (c == 0xFE5A) || (c == 0xFE5C) || (c == 0xFE5E) || (c == 0xFF09) || (c == 0xFF3D) || (c == 0xFF5D) || (c == 0xFF60) || (c == 0xFF63)) 
		return PE;
	else if ((c == 0x005E) || (c == 0x0060) || (c == 0x00A8) || (c == 0x00AF) || (c == 0x00B4) || (c == 0x00B8) || (c >= 0x02C2 && c <= 0x02C5) || (c >= 0x02D2 && c <= 0x02DF) || (c >= 0x02E5 && c <= 0x02EB) || (c == 0x02ED) || (c >= 0x02EF && c <= 0x02FF) || (c == 0x0375) || (c >= 0x0384 && c <= 0x0385) || (c == 0x1FBD) || (c >= 0x1FBF && c <= 0x1FC1) || (c >= 0x1FCD && c <= 0x1FCF) || (c >= 0x1FDD && c <= 0x1FDF) || (c >= 0x1FED && c <= 0x1FEF) || (c >= 0x1FFD && c <= 0x1FFE) || (c >= 0x309B && c <= 0x309C) || (c >= 0xA700 && c <= 0xA716) || (c >= 0xA720 && c <= 0xA721) || (c >= 0xA789 && c <= 0xA78A) || (c == 0xFF3E) || (c == 0xFF40) || (c == 0xFFE3)) 
		return SK;
	else if ((c == 0x00AD) || (c >= 0x0600 && c <= 0x0603) || (c == 0x06DD) || (c == 0x070F) || (c >= 0x17B4 && c <= 0x17B5) || (c >= 0x200B && c <= 0x200F) || (c >= 0x202A && c <= 0x202E) || (c >= 0x2060 && c <= 0x2064) || (c >= 0x206A && c <= 0x206F) || (c == 0xFEFF) || (c >= 0xFFF9 && c <= 0xFFFB) || (c >= 0x1D173 && c <= 0x1D17A) || (c == 0xE0001) || (c >= 0xE0020 && c <= 0xE007F)) 
		return CF;
	else if ((c == 0x0024) || (c >= 0x00A2 && c <= 0x00A5) || (c == 0x060B) || (c >= 0x09F2 && c <= 0x09F3) || (c == 0x0AF1) || (c == 0x0BF9) || (c == 0x0E3F) || (c == 0x17DB) || (c >= 0x20A0 && c <= 0x20B5) || (c == 0xFDFC) || (c == 0xFE69) || (c == 0xFF04) || (c >= 0xFFE0 && c <= 0xFFE1) || (c >= 0xFFE5 && c <= 0xFFE6)) 
		return SC;
	else if ((c >= 0x0000 && c <= 0x001F) || (c >= 0x007F && c <= 0x009F))
		return CC;
	else if ((c == 0x2028)) 
		return ZL;
	else if ((c == 0x002B) || (c >= 0x003C && c <= 0x003E) || (c == 0x007C) || (c == 0x007E) || (c == 0x00AC) || (c == 0x00B1) || (c == 0x00D7) || (c == 0x00F7) || (c == 0x03F6) || (c >= 0x0606 && c <= 0x0608) || (c == 0x2044) || (c == 0x2052) || (c >= 0x207A && c <= 0x207C) || (c >= 0x208A && c <= 0x208C) || (c >= 0x2140 && c <= 0x2144) || (c == 0x214B) || (c >= 0x2190 && c <= 0x2194) || (c >= 0x219A && c <= 0x219B) || (c == 0x21A0) || (c == 0x21A3) || (c == 0x21A6) || (c == 0x21AE) || (c >= 0x21CE && c <= 0x21CF) || (c == 0x21D2) || (c == 0x21D4) || (c >= 0x21F4 && c <= 0x22FF) || (c >= 0x2308 && c <= 0x230B) || (c >= 0x2320 && c <= 0x2321) || (c == 0x237C) || (c >= 0x239B && c <= 0x23B3) || (c >= 0x23DC && c <= 0x23E1) || (c == 0x25B7) || (c == 0x25C1) || (c >= 0x25F8 && c <= 0x25FF) || (c == 0x266F) || (c >= 0x27C0 && c <= 0x27C4) || (c >= 0x27C7 && c <= 0x27CA) || (c == 0x27CC) || (c >= 0x27D0 && c <= 0x27E5) || (c >= 0x27F0 && c <= 0x27FF) || (c >= 0x2900 && c <= 0x2982) || (c >= 0x2999 && c <= 0x29D7) || (c >= 0x29DC && c <= 0x29FB) || (c >= 0x29FE && c <= 0x2AFF) || (c >= 0x2B30 && c <= 0x2B44) || (c >= 0x2B47 && c <= 0x2B4C) || (c == 0xFB29) || (c == 0xFE62) || (c >= 0xFE64 && c <= 0xFE66) || (c == 0xFF0B) || (c >= 0xFF1C && c <= 0xFF1E) || (c == 0xFF5C) || (c == 0xFF5E) || (c == 0xFFE2) || (c >= 0xFFE9 && c <= 0xFFEC) || (c == 0x1D6C1) || (c == 0x1D6DB) || (c == 0x1D6FB) || (c == 0x1D715) || (c == 0x1D735) || (c == 0x1D74F) || (c == 0x1D76F) || (c == 0x1D789) || (c == 0x1D7A9) || (c == 0x1D7C3)) 
		return SM;
	else if ((c == 0x0028) || (c == 0x005B) || (c == 0x007B) || (c == 0x0F3A) || (c == 0x0F3C) || (c == 0x169B) || (c == 0x201A) || (c == 0x201E) || (c == 0x2045) || (c == 0x207D) || (c == 0x208D) || (c == 0x2329) || (c == 0x2768) || (c == 0x276A) || (c == 0x276C) || (c == 0x276E) || (c == 0x2770) || (c == 0x2772) || (c == 0x2774) || (c == 0x27C5) || (c == 0x27E6) || (c == 0x27E8) || (c == 0x27EA) || (c == 0x27EC) || (c == 0x27EE) || (c == 0x2983) || (c == 0x2985) || (c == 0x2987) || (c == 0x2989) || (c == 0x298B) || (c == 0x298D) || (c == 0x298F) || (c == 0x2991) || (c == 0x2993) || (c == 0x2995) || (c == 0x2997) || (c == 0x29D8) || (c == 0x29DA) || (c == 0x29FC) || (c == 0x2E22) || (c == 0x2E24) || (c == 0x2E26) || (c == 0x2E28) || (c == 0x3008) || (c == 0x300A) || (c == 0x300C) || (c == 0x300E) || (c == 0x3010) || (c == 0x3014) || (c == 0x3016) || (c == 0x3018) || (c == 0x301A) || (c == 0x301D) || (c == 0xFD3E) || (c == 0xFE17) || (c == 0xFE35) || (c == 0xFE37) || (c == 0xFE39) || (c == 0xFE3B) || (c == 0xFE3D) || (c == 0xFE3F) || (c == 0xFE41) || (c == 0xFE43) || (c == 0xFE47) || (c == 0xFE59) || (c == 0xFE5B) || (c == 0xFE5D) || (c == 0xFF08) || (c == 0xFF3B) || (c == 0xFF5B) || (c == 0xFF5F) || (c == 0xFF62)) 
		return PS;
	else if ((c >= 0x0041 && c <= 0x005A) || (c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c <= 0x00DE) || (c == 0x0100) || (c == 0x0102) || (c == 0x0104) || (c == 0x0106) || (c == 0x0108) || (c == 0x010A) || (c == 0x010C) || (c == 0x010E) || (c == 0x0110) || (c == 0x0112) || (c == 0x0114) || (c == 0x0116) || (c == 0x0118) || (c == 0x011A) || (c == 0x011C) || (c == 0x011E) || (c == 0x0120) || (c == 0x0122) || (c == 0x0124) || (c == 0x0126) || (c == 0x0128) || (c == 0x012A) || (c == 0x012C) || (c == 0x012E) || (c == 0x0130) || (c == 0x0132) || (c == 0x0134) || (c == 0x0136) || (c == 0x0139) || (c == 0x013B) || (c == 0x013D) || (c == 0x013F) || (c == 0x0141) || (c == 0x0143) || (c == 0x0145) || (c == 0x0147) || (c == 0x014A) || (c == 0x014C) || (c == 0x014E) || (c == 0x0150) || (c == 0x0152) || (c == 0x0154) || (c == 0x0156) || (c == 0x0158) || (c == 0x015A) || (c == 0x015C) || (c == 0x015E) || (c == 0x0160) || (c == 0x0162) || (c == 0x0164) || (c == 0x0166) || (c == 0x0168) || (c == 0x016A) || (c == 0x016C) || (c == 0x016E) || (c == 0x0170) || (c == 0x0172) || (c == 0x0174) || (c == 0x0176) || (c >= 0x0178 && c <= 0x0179) || (c == 0x017B) || (c == 0x017D) || (c >= 0x0181 && c <= 0x0182) || (c == 0x0184) || (c >= 0x0186 && c <= 0x0187) || (c >= 0x0189 && c <= 0x018B) || (c >= 0x018E && c <= 0x0191) || (c >= 0x0193 && c <= 0x0194) || (c >= 0x0196 && c <= 0x0198) || (c >= 0x019C && c <= 0x019D) || (c >= 0x019F && c <= 0x01A0) || (c == 0x01A2) || (c == 0x01A4) || (c >= 0x01A6 && c <= 0x01A7) || (c == 0x01A9) || (c == 0x01AC) || (c >= 0x01AE && c <= 0x01AF) || (c >= 0x01B1 && c <= 0x01B3) || (c == 0x01B5) || (c >= 0x01B7 && c <= 0x01B8) || (c == 0x01BC) || (c == 0x01C4) || (c == 0x01C7) || (c == 0x01CA) || (c == 0x01CD) || (c == 0x01CF) || (c == 0x01D1) || (c == 0x01D3) || (c == 0x01D5) || (c == 0x01D7) || (c == 0x01D9) || (c == 0x01DB) || (c == 0x01DE) || (c == 0x01E0) || (c == 0x01E2) || (c == 0x01E4) || (c == 0x01E6) || (c == 0x01E8) || (c == 0x01EA) || (c == 0x01EC) || (c == 0x01EE) || (c == 0x01F1) || (c == 0x01F4) || (c >= 0x01F6 && c <= 0x01F8) || (c == 0x01FA) || (c == 0x01FC) || (c == 0x01FE) || (c == 0x0200) || (c == 0x0202) || (c == 0x0204) || (c == 0x0206) || (c == 0x0208) || (c == 0x020A) || (c == 0x020C) || (c == 0x020E) || (c == 0x0210) || (c == 0x0212) || (c == 0x0214) || (c == 0x0216) || (c == 0x0218) || (c == 0x021A) || (c == 0x021C) || (c == 0x021E) || (c == 0x0220) || (c == 0x0222) || (c == 0x0224) || (c == 0x0226) || (c == 0x0228) || (c == 0x022A) || (c == 0x022C) || (c == 0x022E) || (c == 0x0230) || (c == 0x0232) || (c >= 0x023A && c <= 0x023B) || (c >= 0x023D && c <= 0x023E) || (c == 0x0241) || (c >= 0x0243 && c <= 0x0246) || (c == 0x0248) || (c == 0x024A) || (c == 0x024C) || (c == 0x024E) || (c == 0x0370) || (c == 0x0372) || (c == 0x0376) || (c == 0x0386) || (c >= 0x0388 && c <= 0x038A) || (c == 0x038C) || (c >= 0x038E && c <= 0x038F) || (c >= 0x0391 && c <= 0x03A1) || (c >= 0x03A3 && c <= 0x03AB) || (c == 0x03CF) || (c >= 0x03D2 && c <= 0x03D4) || (c == 0x03D8) || (c == 0x03DA) || (c == 0x03DC) || (c == 0x03DE) || (c == 0x03E0) || (c == 0x03E2) || (c == 0x03E4) || (c == 0x03E6) || (c == 0x03E8) || (c == 0x03EA) || (c == 0x03EC) || (c == 0x03EE) || (c == 0x03F4) || (c == 0x03F7) || (c >= 0x03F9 && c <= 0x03FA) || (c >= 0x03FD && c <= 0x042F) || (c == 0x0460) || (c == 0x0462) || (c == 0x0464) || (c == 0x0466) || (c == 0x0468) || (c == 0x046A) || (c == 0x046C) || (c == 0x046E) || (c == 0x0470) || (c == 0x0472) || (c == 0x0474) || (c == 0x0476) || (c == 0x0478) || (c == 0x047A) || (c == 0x047C) || (c == 0x047E) || (c == 0x0480) || (c == 0x048A) || (c == 0x048C) || (c == 0x048E) || (c == 0x0490) || (c == 0x0492) || (c == 0x0494) || (c == 0x0496) || (c == 0x0498) || (c == 0x049A) || (c == 0x049C) || (c == 0x049E) || (c == 0x04A0) || (c == 0x04A2) || (c == 0x04A4) || (c == 0x04A6) || (c == 0x04A8) || (c == 0x04AA) || (c == 0x04AC) || (c == 0x04AE) || (c == 0x04B0) || (c == 0x04B2) || (c == 0x04B4) || (c == 0x04B6) || (c == 0x04B8) || (c == 0x04BA) || (c == 0x04BC) || (c == 0x04BE) || (c >= 0x04C0 && c <= 0x04C1) || (c == 0x04C3) || (c == 0x04C5) || (c == 0x04C7) || (c == 0x04C9) || (c == 0x04CB) || (c == 0x04CD) || (c == 0x04D0) || (c == 0x04D2) || (c == 0x04D4) || (c == 0x04D6) || (c == 0x04D8) || (c == 0x04DA) || (c == 0x04DC) || (c == 0x04DE) || (c == 0x04E0) || (c == 0x04E2) || (c == 0x04E4) || (c == 0x04E6) || (c == 0x04E8) || (c == 0x04EA) || (c == 0x04EC) || (c == 0x04EE) || (c == 0x04F0) || (c == 0x04F2) || (c == 0x04F4) || (c == 0x04F6) || (c == 0x04F8) || (c == 0x04FA) || (c == 0x04FC) || (c == 0x04FE) || (c == 0x0500) || (c == 0x0502) || (c == 0x0504) || (c == 0x0506) || (c == 0x0508) || (c == 0x050A) || (c == 0x050C) || (c == 0x050E) || (c == 0x0510) || (c == 0x0512) || (c == 0x0514) || (c == 0x0516) || (c == 0x0518) || (c == 0x051A) || (c == 0x051C) || (c == 0x051E) || (c == 0x0520) || (c == 0x0522) || (c >= 0x0531 && c <= 0x0556) || (c >= 0x10A0 && c <= 0x10C5) || (c == 0x1E00) || (c == 0x1E02) || (c == 0x1E04) || (c == 0x1E06) || (c == 0x1E08) || (c == 0x1E0A) || (c == 0x1E0C) || (c == 0x1E0E) || (c == 0x1E10) || (c == 0x1E12) || (c == 0x1E14) || (c == 0x1E16) || (c == 0x1E18) || (c == 0x1E1A) || (c == 0x1E1C) || (c == 0x1E1E) || (c == 0x1E20) || (c == 0x1E22) || (c == 0x1E24) || (c == 0x1E26) || (c == 0x1E28) || (c == 0x1E2A) || (c == 0x1E2C) || (c == 0x1E2E) || (c == 0x1E30) || (c == 0x1E32) || (c == 0x1E34) || (c == 0x1E36) || (c == 0x1E38) || (c == 0x1E3A) || (c == 0x1E3C) || (c == 0x1E3E) || (c == 0x1E40) || (c == 0x1E42) || (c == 0x1E44) || (c == 0x1E46) || (c == 0x1E48) || (c == 0x1E4A) || (c == 0x1E4C) || (c == 0x1E4E) || (c == 0x1E50) || (c == 0x1E52) || (c == 0x1E54) || (c == 0x1E56) || (c == 0x1E58) || (c == 0x1E5A) || (c == 0x1E5C) || (c == 0x1E5E) || (c == 0x1E60) || (c == 0x1E62) || (c == 0x1E64) || (c == 0x1E66) || (c == 0x1E68) || (c == 0x1E6A) || (c == 0x1E6C) || (c == 0x1E6E) || (c == 0x1E70) || (c == 0x1E72) || (c == 0x1E74) || (c == 0x1E76) || (c == 0x1E78) || (c == 0x1E7A) || (c == 0x1E7C) || (c == 0x1E7E) || (c == 0x1E80) || (c == 0x1E82) || (c == 0x1E84) || (c == 0x1E86) || (c == 0x1E88) || (c == 0x1E8A) || (c == 0x1E8C) || (c == 0x1E8E) || (c == 0x1E90) || (c == 0x1E92) || (c == 0x1E94) || (c == 0x1E9E) || (c == 0x1EA0) || (c == 0x1EA2) || (c == 0x1EA4) || (c == 0x1EA6) || (c == 0x1EA8) || (c == 0x1EAA) || (c == 0x1EAC) || (c == 0x1EAE) || (c == 0x1EB0) || (c == 0x1EB2) || (c == 0x1EB4) || (c == 0x1EB6) || (c == 0x1EB8) || (c == 0x1EBA) || (c == 0x1EBC) || (c == 0x1EBE) || (c == 0x1EC0) || (c == 0x1EC2) || (c == 0x1EC4) || (c == 0x1EC6) || (c == 0x1EC8) || (c == 0x1ECA) || (c == 0x1ECC) || (c == 0x1ECE) || (c == 0x1ED0) || (c == 0x1ED2) || (c == 0x1ED4) || (c == 0x1ED6) || (c == 0x1ED8) || (c == 0x1EDA) || (c == 0x1EDC) || (c == 0x1EDE) || (c == 0x1EE0) || (c == 0x1EE2) || (c == 0x1EE4) || (c == 0x1EE6) || (c == 0x1EE8) || (c == 0x1EEA) || (c == 0x1EEC) || (c == 0x1EEE) || (c == 0x1EF0) || (c == 0x1EF2) || (c == 0x1EF4) || (c == 0x1EF6) || (c == 0x1EF8) || (c == 0x1EFA) || (c == 0x1EFC) || (c == 0x1EFE) || (c >= 0x1F08 && c <= 0x1F0F) || (c >= 0x1F18 && c <= 0x1F1D) || (c >= 0x1F28 && c <= 0x1F2F) || (c >= 0x1F38 && c <= 0x1F3F) || (c >= 0x1F48 && c <= 0x1F4D) || (c == 0x1F59) || (c == 0x1F5B) || (c == 0x1F5D) || (c == 0x1F5F) || (c >= 0x1F68 && c <= 0x1F6F) || (c >= 0x1FB8 && c <= 0x1FBB) || (c >= 0x1FC8 && c <= 0x1FCB) || (c >= 0x1FD8 && c <= 0x1FDB) || (c >= 0x1FE8 && c <= 0x1FEC) || (c >= 0x1FF8 && c <= 0x1FFB) || (c == 0x2102) || (c == 0x2107) || (c >= 0x210B && c <= 0x210D) || (c >= 0x2110 && c <= 0x2112) || (c == 0x2115) || (c >= 0x2119 && c <= 0x211D) || (c == 0x2124) || (c == 0x2126) || (c == 0x2128) || (c >= 0x212A && c <= 0x212D) || (c >= 0x2130 && c <= 0x2133) || (c >= 0x213E && c <= 0x213F) || (c == 0x2145) || (c == 0x2183) || (c >= 0x2C00 && c <= 0x2C2E) || (c == 0x2C60) || (c >= 0x2C62 && c <= 0x2C64) || (c == 0x2C67) || (c == 0x2C69) || (c == 0x2C6B) || (c >= 0x2C6D && c <= 0x2C6F) || (c == 0x2C72) || (c == 0x2C75) || (c == 0x2C80) || (c == 0x2C82) || (c == 0x2C84) || (c == 0x2C86) || (c == 0x2C88) || (c == 0x2C8A) || (c == 0x2C8C) || (c == 0x2C8E) || (c == 0x2C90) || (c == 0x2C92) || (c == 0x2C94) || (c == 0x2C96) || (c == 0x2C98) || (c == 0x2C9A) || (c == 0x2C9C) || (c == 0x2C9E) || (c == 0x2CA0) || (c == 0x2CA2) || (c == 0x2CA4) || (c == 0x2CA6) || (c == 0x2CA8) || (c == 0x2CAA) || (c == 0x2CAC) || (c == 0x2CAE) || (c == 0x2CB0) || (c == 0x2CB2) || (c == 0x2CB4) || (c == 0x2CB6) || (c == 0x2CB8) || (c == 0x2CBA) || (c == 0x2CBC) || (c == 0x2CBE) || (c == 0x2CC0) || (c == 0x2CC2) || (c == 0x2CC4) || (c == 0x2CC6) || (c == 0x2CC8) || (c == 0x2CCA) || (c == 0x2CCC) || (c == 0x2CCE) || (c == 0x2CD0) || (c == 0x2CD2) || (c == 0x2CD4) || (c == 0x2CD6) || (c == 0x2CD8) || (c == 0x2CDA) || (c == 0x2CDC) || (c == 0x2CDE) || (c == 0x2CE0) || (c == 0x2CE2) || (c == 0xA640) || (c == 0xA642) || (c == 0xA644) || (c == 0xA646) || (c == 0xA648) || (c == 0xA64A) || (c == 0xA64C) || (c == 0xA64E) || (c == 0xA650) || (c == 0xA652) || (c == 0xA654) || (c == 0xA656) || (c == 0xA658) || (c == 0xA65A) || (c == 0xA65C) || (c == 0xA65E) || (c == 0xA662) || (c == 0xA664) || (c == 0xA666) || (c == 0xA668) || (c == 0xA66A) || (c == 0xA66C) || (c == 0xA680) || (c == 0xA682) || (c == 0xA684) || (c == 0xA686) || (c == 0xA688) || (c == 0xA68A) || (c == 0xA68C) || (c == 0xA68E) || (c == 0xA690) || (c == 0xA692) || (c == 0xA694) || (c == 0xA696) || (c == 0xA722) || (c == 0xA724) || (c == 0xA726) || (c == 0xA728) || (c == 0xA72A) || (c == 0xA72C) || (c == 0xA72E) || (c == 0xA732) || (c == 0xA734) || (c == 0xA736) || (c == 0xA738) || (c == 0xA73A) || (c == 0xA73C) || (c == 0xA73E) || (c == 0xA740) || (c == 0xA742) || (c == 0xA744) || (c == 0xA746) || (c == 0xA748) || (c == 0xA74A) || (c == 0xA74C) || (c == 0xA74E) || (c == 0xA750) || (c == 0xA752) || (c == 0xA754) || (c == 0xA756) || (c == 0xA758) || (c == 0xA75A) || (c == 0xA75C) || (c == 0xA75E) || (c == 0xA760) || (c == 0xA762) || (c == 0xA764) || (c == 0xA766) || (c == 0xA768) || (c == 0xA76A) || (c == 0xA76C) || (c == 0xA76E) || (c == 0xA779) || (c == 0xA77B) || (c >= 0xA77D && c <= 0xA77E) || (c == 0xA780) || (c == 0xA782) || (c == 0xA784) || (c == 0xA786) || (c == 0xA78B) || (c >= 0xFF21 && c <= 0xFF3A) || (c >= 0x10400 && c <= 0x10427) || (c >= 0x1D400 && c <= 0x1D419) || (c >= 0x1D434 && c <= 0x1D44D) || (c >= 0x1D468 && c <= 0x1D481) || (c == 0x1D49C) || (c >= 0x1D49E && c <= 0x1D49F) || (c == 0x1D4A2) || (c >= 0x1D4A5 && c <= 0x1D4A6) || (c >= 0x1D4A9 && c <= 0x1D4AC) || (c >= 0x1D4AE && c <= 0x1D4B5) || (c >= 0x1D4D0 && c <= 0x1D4E9) || (c >= 0x1D504 && c <= 0x1D505) || (c >= 0x1D507 && c <= 0x1D50A) || (c >= 0x1D50D && c <= 0x1D514) || (c >= 0x1D516 && c <= 0x1D51C) || (c >= 0x1D538 && c <= 0x1D539) || (c >= 0x1D53B && c <= 0x1D53E) || (c >= 0x1D540 && c <= 0x1D544) || (c == 0x1D546) || (c >= 0x1D54A && c <= 0x1D550) || (c >= 0x1D56C && c <= 0x1D585) || (c >= 0x1D5A0 && c <= 0x1D5B9) || (c >= 0x1D5D4 && c <= 0x1D5ED) || (c >= 0x1D608 && c <= 0x1D621) || (c >= 0x1D63C && c <= 0x1D655) || (c >= 0x1D670 && c <= 0x1D689) || (c >= 0x1D6A8 && c <= 0x1D6C0) || (c >= 0x1D6E2 && c <= 0x1D6FA) || (c >= 0x1D71C && c <= 0x1D734) || (c >= 0x1D756 && c <= 0x1D76E) || (c >= 0x1D790 && c <= 0x1D7A8) || (c == 0x1D7CA)) 
		return LU;
	else if ((c == 0x01C5) || (c == 0x01C8) || (c == 0x01CB) || (c == 0x01F2) || (c >= 0x1F88 && c <= 0x1F8F) || (c >= 0x1F98 && c <= 0x1F9F) || (c >= 0x1FA8 && c <= 0x1FAF) || (c == 0x1FBC) || (c == 0x1FCC) || (c == 0x1FFC)) 
		return LT;
	else if ((c >= 0x00B2 && c <= 0x00B3) || (c == 0x00B9) || (c >= 0x00BC && c <= 0x00BE) || (c >= 0x09F4 && c <= 0x09F9) || (c >= 0x0BF0 && c <= 0x0BF2) || (c >= 0x0C78 && c <= 0x0C7E) || (c >= 0x0D70 && c <= 0x0D75) || (c >= 0x0F2A && c <= 0x0F33) || (c >= 0x1369 && c <= 0x137C) || (c >= 0x17F0 && c <= 0x17F9) || (c == 0x2070) || (c >= 0x2074 && c <= 0x2079) || (c >= 0x2080 && c <= 0x2089) || (c >= 0x2153 && c <= 0x215F) || (c >= 0x2460 && c <= 0x249B) || (c >= 0x24EA && c <= 0x24FF) || (c >= 0x2776 && c <= 0x2793) || (c == 0x2CFD) || (c >= 0x3192 && c <= 0x3195) || (c >= 0x3220 && c <= 0x3229) || (c >= 0x3251 && c <= 0x325F) || (c >= 0x3280 && c <= 0x3289) || (c >= 0x32B1 && c <= 0x32BF) || (c >= 0x10107 && c <= 0x10133) || (c >= 0x10175 && c <= 0x10178) || (c == 0x1018A) || (c >= 0x10320 && c <= 0x10323) || (c >= 0x10916 && c <= 0x10919) || (c >= 0x10A40 && c <= 0x10A47) || (c >= 0x1D360 && c <= 0x1D371)) 
		return NO;
	else if ((c >= 0x0030 && c <= 0x0039) || (c >= 0x0660 && c <= 0x0669) || (c >= 0x06F0 && c <= 0x06F9) || (c >= 0x07C0 && c <= 0x07C9) || (c >= 0x0966 && c <= 0x096F) || (c >= 0x09E6 && c <= 0x09EF) || (c >= 0x0A66 && c <= 0x0A6F) || (c >= 0x0AE6 && c <= 0x0AEF) || (c >= 0x0B66 && c <= 0x0B6F) || (c >= 0x0BE6 && c <= 0x0BEF) || (c >= 0x0C66 && c <= 0x0C6F) || (c >= 0x0CE6 && c <= 0x0CEF) || (c >= 0x0D66 && c <= 0x0D6F) || (c >= 0x0E50 && c <= 0x0E59) || (c >= 0x0ED0 && c <= 0x0ED9) || (c >= 0x0F20 && c <= 0x0F29) || (c >= 0x1040 && c <= 0x1049) || (c >= 0x1090 && c <= 0x1099) || (c >= 0x17E0 && c <= 0x17E9) || (c >= 0x1810 && c <= 0x1819) || (c >= 0x1946 && c <= 0x194F) || (c >= 0x19D0 && c <= 0x19D9) || (c >= 0x1B50 && c <= 0x1B59) || (c >= 0x1BB0 && c <= 0x1BB9) || (c >= 0x1C40 && c <= 0x1C49) || (c >= 0x1C50 && c <= 0x1C59) || (c >= 0xA620 && c <= 0xA629) || (c >= 0xA8D0 && c <= 0xA8D9) || (c >= 0xA900 && c <= 0xA909) || (c >= 0xAA50 && c <= 0xAA59) || (c >= 0xFF10 && c <= 0xFF19) || (c >= 0x104A0 && c <= 0x104A9) || (c >= 0x1D7CE && c <= 0x1D7FF)) 
		return ND;
	else if ((c == 0x005F) || (c >= 0x203F && c <= 0x2040) || (c == 0x2054) || (c >= 0xFE33 && c <= 0xFE34) || (c >= 0xFE4D && c <= 0xFE4F) || (c == 0xFF3F)) 
		return PC;
	else if ((c >= 0x00A6 && c <= 0x00A7) || (c == 0x00A9) || (c == 0x00AE) || (c == 0x00B0) || (c == 0x00B6) || (c == 0x0482) || (c >= 0x060E && c <= 0x060F) || (c == 0x06E9) || (c >= 0x06FD && c <= 0x06FE) || (c == 0x07F6) || (c == 0x09FA) || (c == 0x0B70) || (c >= 0x0BF3 && c <= 0x0BF8) || (c == 0x0BFA) || (c == 0x0C7F) || (c >= 0x0CF1 && c <= 0x0CF2) || (c == 0x0D79) || (c >= 0x0F01 && c <= 0x0F03) || (c >= 0x0F13 && c <= 0x0F17) || (c >= 0x0F1A && c <= 0x0F1F) || (c == 0x0F34) || (c == 0x0F36) || (c == 0x0F38) || (c >= 0x0FBE && c <= 0x0FC5) || (c >= 0x0FC7 && c <= 0x0FCC) || (c >= 0x0FCE && c <= 0x0FCF) || (c >= 0x109E && c <= 0x109F) || (c == 0x1360) || (c >= 0x1390 && c <= 0x1399) || (c == 0x1940) || (c >= 0x19E0 && c <= 0x19FF) || (c >= 0x1B61 && c <= 0x1B6A) || (c >= 0x1B74 && c <= 0x1B7C) || (c >= 0x2100 && c <= 0x2101) || (c >= 0x2103 && c <= 0x2106) || (c >= 0x2108 && c <= 0x2109) || (c == 0x2114) || (c >= 0x2116 && c <= 0x2118) || (c >= 0x211E && c <= 0x2123) || (c == 0x2125) || (c == 0x2127) || (c == 0x2129) || (c == 0x212E) || (c >= 0x213A && c <= 0x213B) || (c == 0x214A) || (c >= 0x214C && c <= 0x214D) || (c == 0x214F) || (c >= 0x2195 && c <= 0x2199) || (c >= 0x219C && c <= 0x219F) || (c >= 0x21A1 && c <= 0x21A2) || (c >= 0x21A4 && c <= 0x21A5) || (c >= 0x21A7 && c <= 0x21AD) || (c >= 0x21AF && c <= 0x21CD) || (c >= 0x21D0 && c <= 0x21D1) || (c == 0x21D3) || (c >= 0x21D5 && c <= 0x21F3) || (c >= 0x2300 && c <= 0x2307) || (c >= 0x230C && c <= 0x231F) || (c >= 0x2322 && c <= 0x2328) || (c >= 0x232B && c <= 0x237B) || (c >= 0x237D && c <= 0x239A) || (c >= 0x23B4 && c <= 0x23DB) || (c >= 0x23E2 && c <= 0x23E7) || (c >= 0x2400 && c <= 0x2426) || (c >= 0x2440 && c <= 0x244A) || (c >= 0x249C && c <= 0x24E9) || (c >= 0x2500 && c <= 0x25B6) || (c >= 0x25B8 && c <= 0x25C0) || (c >= 0x25C2 && c <= 0x25F7) || (c >= 0x2600 && c <= 0x266E) || (c >= 0x2670 && c <= 0x269D) || (c >= 0x26A0 && c <= 0x26BC) || (c >= 0x26C0 && c <= 0x26C3) || (c >= 0x2701 && c <= 0x2704) || (c >= 0x2706 && c <= 0x2709) || (c >= 0x270C && c <= 0x2727) || (c >= 0x2729 && c <= 0x274B) || (c == 0x274D) || (c >= 0x274F && c <= 0x2752) || (c == 0x2756) || (c >= 0x2758 && c <= 0x275E) || (c >= 0x2761 && c <= 0x2767) || (c == 0x2794) || (c >= 0x2798 && c <= 0x27AF) || (c >= 0x27B1 && c <= 0x27BE) || (c >= 0x2800 && c <= 0x28FF) || (c >= 0x2B00 && c <= 0x2B2F) || (c >= 0x2B45 && c <= 0x2B46) || (c >= 0x2B50 && c <= 0x2B54) || (c >= 0x2CE5 && c <= 0x2CEA) || (c >= 0x2E80 && c <= 0x2E99) || (c >= 0x2E9B && c <= 0x2EF3) || (c >= 0x2F00 && c <= 0x2FD5) || (c >= 0x2FF0 && c <= 0x2FFB) || (c == 0x3004) || (c >= 0x3012 && c <= 0x3013) || (c == 0x3020) || (c >= 0x3036 && c <= 0x3037) || (c >= 0x303E && c <= 0x303F) || (c >= 0x3190 && c <= 0x3191) || (c >= 0x3196 && c <= 0x319F) || (c >= 0x31C0 && c <= 0x31E3) || (c >= 0x3200 && c <= 0x321E) || (c >= 0x322A && c <= 0x3243) || (c == 0x3250) || (c >= 0x3260 && c <= 0x327F) || (c >= 0x328A && c <= 0x32B0) || (c >= 0x32C0 && c <= 0x32FE) || (c >= 0x3300 && c <= 0x33FF) || (c >= 0x4DC0 && c <= 0x4DFF) || (c >= 0xA490 && c <= 0xA4C6) || (c >= 0xA828 && c <= 0xA82B) || (c == 0xFDFD) || (c == 0xFFE4) || (c == 0xFFE8) || (c >= 0xFFED && c <= 0xFFEE) || (c >= 0xFFFC && c <= 0xFFFD) || (c == 0x10102) || (c >= 0x10137 && c <= 0x1013F) || (c >= 0x10179 && c <= 0x10189) || (c >= 0x10190 && c <= 0x1019B) || (c >= 0x101D0 && c <= 0x101FC) || (c >= 0x1D000 && c <= 0x1D0F5) || (c >= 0x1D100 && c <= 0x1D126) || (c >= 0x1D129 && c <= 0x1D164) || (c >= 0x1D16A && c <= 0x1D16C) || (c >= 0x1D183 && c <= 0x1D184) || (c >= 0x1D18C && c <= 0x1D1A9) || (c >= 0x1D1AE && c <= 0x1D1DD) || (c >= 0x1D200 && c <= 0x1D241) || (c == 0x1D245) || (c >= 0x1D300 && c <= 0x1D356) || (c >= 0x1F000 && c <= 0x1F02B) || (c >= 0x1F030 && c <= 0x1F093)) 
		return SO;
	else if ((c == 0x0903) || (c >= 0x093E && c <= 0x0940) || (c >= 0x0949 && c <= 0x094C) || (c >= 0x0982 && c <= 0x0983) || (c >= 0x09BE && c <= 0x09C0) || (c >= 0x09C7 && c <= 0x09C8) || (c >= 0x09CB && c <= 0x09CC) || (c == 0x09D7) || (c == 0x0A03) || (c >= 0x0A3E && c <= 0x0A40) || (c == 0x0A83) || (c >= 0x0ABE && c <= 0x0AC0) || (c == 0x0AC9) || (c >= 0x0ACB && c <= 0x0ACC) || (c >= 0x0B02 && c <= 0x0B03) || (c == 0x0B3E) || (c == 0x0B40) || (c >= 0x0B47 && c <= 0x0B48) || (c >= 0x0B4B && c <= 0x0B4C) || (c == 0x0B57) || (c >= 0x0BBE && c <= 0x0BBF) || (c >= 0x0BC1 && c <= 0x0BC2) || (c >= 0x0BC6 && c <= 0x0BC8) || (c >= 0x0BCA && c <= 0x0BCC) || (c == 0x0BD7) || (c >= 0x0C01 && c <= 0x0C03) || (c >= 0x0C41 && c <= 0x0C44) || (c >= 0x0C82 && c <= 0x0C83) || (c == 0x0CBE) || (c >= 0x0CC0 && c <= 0x0CC4) || (c >= 0x0CC7 && c <= 0x0CC8) || (c >= 0x0CCA && c <= 0x0CCB) || (c >= 0x0CD5 && c <= 0x0CD6) || (c >= 0x0D02 && c <= 0x0D03) || (c >= 0x0D3E && c <= 0x0D40) || (c >= 0x0D46 && c <= 0x0D48) || (c >= 0x0D4A && c <= 0x0D4C) || (c == 0x0D57) || (c >= 0x0D82 && c <= 0x0D83) || (c >= 0x0DCF && c <= 0x0DD1) || (c >= 0x0DD8 && c <= 0x0DDF) || (c >= 0x0DF2 && c <= 0x0DF3) || (c >= 0x0F3E && c <= 0x0F3F) || (c == 0x0F7F) || (c >= 0x102B && c <= 0x102C) || (c == 0x1031) || (c == 0x1038) || (c >= 0x103B && c <= 0x103C) || (c >= 0x1056 && c <= 0x1057) || (c >= 0x1062 && c <= 0x1064) || (c >= 0x1067 && c <= 0x106D) || (c >= 0x1083 && c <= 0x1084) || (c >= 0x1087 && c <= 0x108C) || (c == 0x108F) || (c == 0x17B6) || (c >= 0x17BE && c <= 0x17C5) || (c >= 0x17C7 && c <= 0x17C8) || (c >= 0x1923 && c <= 0x1926) || (c >= 0x1929 && c <= 0x192B) || (c >= 0x1930 && c <= 0x1931) || (c >= 0x1933 && c <= 0x1938) || (c >= 0x19B0 && c <= 0x19C0) || (c >= 0x19C8 && c <= 0x19C9) || (c >= 0x1A19 && c <= 0x1A1B) || (c == 0x1B04) || (c == 0x1B35) || (c == 0x1B3B) || (c >= 0x1B3D && c <= 0x1B41) || (c >= 0x1B43 && c <= 0x1B44) || (c == 0x1B82) || (c == 0x1BA1) || (c >= 0x1BA6 && c <= 0x1BA7) || (c == 0x1BAA) || (c >= 0x1C24 && c <= 0x1C2B) || (c >= 0x1C34 && c <= 0x1C35) || (c >= 0xA823 && c <= 0xA824) || (c == 0xA827) || (c >= 0xA880 && c <= 0xA881) || (c >= 0xA8B4 && c <= 0xA8C3) || (c >= 0xA952 && c <= 0xA953) || (c >= 0xAA2F && c <= 0xAA30) || (c >= 0xAA33 && c <= 0xAA34) || (c == 0xAA4D) || (c >= 0x1D165 && c <= 0x1D166) || (c >= 0x1D16D && c <= 0x1D172)) 
		return MC;
	else if ((c == 0x0020) || (c == 0x00A0) || (c == 0x1680) || (c == 0x180E) || (c >= 0x2000 && c <= 0x200A) || (c == 0x202F) || (c == 0x205F) || (c == 0x3000)) 
		return ZS;
	else if ((c >= 0x0021 && c <= 0x0023) || (c >= 0x0025 && c <= 0x0027) || (c == 0x002A) || (c == 0x002C) || (c >= 0x002E && c <= 0x002F) || (c >= 0x003A && c <= 0x003B) || (c >= 0x003F && c <= 0x0040) || (c == 0x005C) || (c == 0x00A1) || (c == 0x00B7) || (c == 0x00BF) || (c == 0x037E) || (c == 0x0387) || (c >= 0x055A && c <= 0x055F) || (c == 0x0589) || (c == 0x05C0) || (c == 0x05C3) || (c == 0x05C6) || (c >= 0x05F3 && c <= 0x05F4) || (c >= 0x0609 && c <= 0x060A) || (c >= 0x060C && c <= 0x060D) || (c == 0x061B) || (c >= 0x061E && c <= 0x061F) || (c >= 0x066A && c <= 0x066D) || (c == 0x06D4) || (c >= 0x0700 && c <= 0x070D) || (c >= 0x07F7 && c <= 0x07F9) || (c >= 0x0964 && c <= 0x0965) || (c == 0x0970) || (c == 0x0DF4) || (c == 0x0E4F) || (c >= 0x0E5A && c <= 0x0E5B) || (c >= 0x0F04 && c <= 0x0F12) || (c == 0x0F85) || (c >= 0x0FD0 && c <= 0x0FD4) || (c >= 0x104A && c <= 0x104F) || (c == 0x10FB) || (c >= 0x1361 && c <= 0x1368) || (c >= 0x166D && c <= 0x166E) || (c >= 0x16EB && c <= 0x16ED) || (c >= 0x1735 && c <= 0x1736) || (c >= 0x17D4 && c <= 0x17D6) || (c >= 0x17D8 && c <= 0x17DA) || (c >= 0x1800 && c <= 0x1805) || (c >= 0x1807 && c <= 0x180A) || (c >= 0x1944 && c <= 0x1945) || (c >= 0x19DE && c <= 0x19DF) || (c >= 0x1A1E && c <= 0x1A1F) || (c >= 0x1B5A && c <= 0x1B60) || (c >= 0x1C3B && c <= 0x1C3F) || (c >= 0x1C7E && c <= 0x1C7F) || (c >= 0x2016 && c <= 0x2017) || (c >= 0x2020 && c <= 0x2027) || (c >= 0x2030 && c <= 0x2038) || (c >= 0x203B && c <= 0x203E) || (c >= 0x2041 && c <= 0x2043) || (c >= 0x2047 && c <= 0x2051) || (c == 0x2053) || (c >= 0x2055 && c <= 0x205E) || (c >= 0x2CF9 && c <= 0x2CFC) || (c >= 0x2CFE && c <= 0x2CFF) || (c >= 0x2E00 && c <= 0x2E01) || (c >= 0x2E06 && c <= 0x2E08) || (c == 0x2E0B) || (c >= 0x2E0E && c <= 0x2E16) || (c >= 0x2E18 && c <= 0x2E19) || (c == 0x2E1B) || (c >= 0x2E1E && c <= 0x2E1F) || (c >= 0x2E2A && c <= 0x2E2E) || (c == 0x2E30) || (c >= 0x3001 && c <= 0x3003) || (c == 0x303D) || (c == 0x30FB) || (c >= 0xA60D && c <= 0xA60F) || (c == 0xA673) || (c == 0xA67E) || (c >= 0xA874 && c <= 0xA877) || (c >= 0xA8CE && c <= 0xA8CF) || (c >= 0xA92E && c <= 0xA92F) || (c == 0xA95F) || (c >= 0xAA5C && c <= 0xAA5F) || (c >= 0xFE10 && c <= 0xFE16) || (c == 0xFE19) || (c == 0xFE30) || (c >= 0xFE45 && c <= 0xFE46) || (c >= 0xFE49 && c <= 0xFE4C) || (c >= 0xFE50 && c <= 0xFE52) || (c >= 0xFE54 && c <= 0xFE57) || (c >= 0xFE5F && c <= 0xFE61) || (c == 0xFE68) || (c >= 0xFE6A && c <= 0xFE6B) || (c >= 0xFF01 && c <= 0xFF03) || (c >= 0xFF05 && c <= 0xFF07) || (c == 0xFF0A) || (c == 0xFF0C) || (c >= 0xFF0E && c <= 0xFF0F) || (c >= 0xFF1A && c <= 0xFF1B) || (c >= 0xFF1F && c <= 0xFF20) || (c == 0xFF3C) || (c == 0xFF61) || (c >= 0xFF64 && c <= 0xFF65) || (c >= 0x10100 && c <= 0x10101) || (c == 0x1039F) || (c == 0x103D0) || (c == 0x1091F) || (c == 0x1093F) || (c >= 0x10A50 && c <= 0x10A58) || (c >= 0x12470 && c <= 0x12473)) 
		return PO;
	else if ((c >= 0x16EE && c <= 0x16F0) || (c >= 0x2160 && c <= 0x2182) || (c >= 0x2185 && c <= 0x2188) || (c == 0x3007) || (c >= 0x3021 && c <= 0x3029) || (c >= 0x3038 && c <= 0x303A) || (c >= 0x10140 && c <= 0x10174) || (c == 0x10341) || (c == 0x1034A) || (c >= 0x103D1 && c <= 0x103D5) || (c >= 0x12400 && c <= 0x12462)) 
		return NL;
	else if ((c >= 0x02B0 && c <= 0x02C1) || (c >= 0x02C6 && c <= 0x02D1) || (c >= 0x02E0 && c <= 0x02E4) || (c == 0x02EC) || (c == 0x02EE) || (c == 0x0374) || (c == 0x037A) || (c == 0x0559) || (c == 0x0640) || (c >= 0x06E5 && c <= 0x06E6) || (c >= 0x07F4 && c <= 0x07F5) || (c == 0x07FA) || (c == 0x0971) || (c == 0x0E46) || (c == 0x0EC6) || (c == 0x10FC) || (c == 0x17D7) || (c == 0x1843) || (c >= 0x1C78 && c <= 0x1C7D) || (c >= 0x1D2C && c <= 0x1D61) || (c == 0x1D78) || (c >= 0x1D9B && c <= 0x1DBF) || (c >= 0x2090 && c <= 0x2094) || (c == 0x2C7D) || (c == 0x2D6F) || (c == 0x2E2F) || (c == 0x3005) || (c >= 0x3031 && c <= 0x3035) || (c == 0x303B) || (c >= 0x309D && c <= 0x309E) || (c >= 0x30FC && c <= 0x30FE) || (c == 0xA015) || (c == 0xA60C) || (c == 0xA67F) || (c >= 0xA717 && c <= 0xA71F) || (c == 0xA770) || (c == 0xA788) || (c == 0xFF70) || (c >= 0xFF9E && c <= 0xFF9F)) 
		return LM;
	else if ((c >= 0x0061 && c <= 0x007A) || (c == 0x00AA) || (c == 0x00B5) || (c == 0x00BA) || (c >= 0x00DF && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FF) || (c == 0x0101) || (c == 0x0103) || (c == 0x0105) || (c == 0x0107) || (c == 0x0109) || (c == 0x010B) || (c == 0x010D) || (c == 0x010F) || (c == 0x0111) || (c == 0x0113) || (c == 0x0115) || (c == 0x0117) || (c == 0x0119) || (c == 0x011B) || (c == 0x011D) || (c == 0x011F) || (c == 0x0121) || (c == 0x0123) || (c == 0x0125) || (c == 0x0127) || (c == 0x0129) || (c == 0x012B) || (c == 0x012D) || (c == 0x012F) || (c == 0x0131) || (c == 0x0133) || (c == 0x0135) || (c >= 0x0137 && c <= 0x0138) || (c == 0x013A) || (c == 0x013C) || (c == 0x013E) || (c == 0x0140) || (c == 0x0142) || (c == 0x0144) || (c == 0x0146) || (c >= 0x0148 && c <= 0x0149) || (c == 0x014B) || (c == 0x014D) || (c == 0x014F) || (c == 0x0151) || (c == 0x0153) || (c == 0x0155) || (c == 0x0157) || (c == 0x0159) || (c == 0x015B) || (c == 0x015D) || (c == 0x015F) || (c == 0x0161) || (c == 0x0163) || (c == 0x0165) || (c == 0x0167) || (c == 0x0169) || (c == 0x016B) || (c == 0x016D) || (c == 0x016F) || (c == 0x0171) || (c == 0x0173) || (c == 0x0175) || (c == 0x0177) || (c == 0x017A) || (c == 0x017C) || (c >= 0x017E && c <= 0x0180) || (c == 0x0183) || (c == 0x0185) || (c == 0x0188) || (c >= 0x018C && c <= 0x018D) || (c == 0x0192) || (c == 0x0195) || (c >= 0x0199 && c <= 0x019B) || (c == 0x019E) || (c == 0x01A1) || (c == 0x01A3) || (c == 0x01A5) || (c == 0x01A8) || (c >= 0x01AA && c <= 0x01AB) || (c == 0x01AD) || (c == 0x01B0) || (c == 0x01B4) || (c == 0x01B6) || (c >= 0x01B9 && c <= 0x01BA) || (c >= 0x01BD && c <= 0x01BF) || (c == 0x01C6) || (c == 0x01C9) || (c == 0x01CC) || (c == 0x01CE) || (c == 0x01D0) || (c == 0x01D2) || (c == 0x01D4) || (c == 0x01D6) || (c == 0x01D8) || (c == 0x01DA) || (c >= 0x01DC && c <= 0x01DD) || (c == 0x01DF) || (c == 0x01E1) || (c == 0x01E3) || (c == 0x01E5) || (c == 0x01E7) || (c == 0x01E9) || (c == 0x01EB) || (c == 0x01ED) || (c >= 0x01EF && c <= 0x01F0) || (c == 0x01F3) || (c == 0x01F5) || (c == 0x01F9) || (c == 0x01FB) || (c == 0x01FD) || (c == 0x01FF) || (c == 0x0201) || (c == 0x0203) || (c == 0x0205) || (c == 0x0207) || (c == 0x0209) || (c == 0x020B) || (c == 0x020D) || (c == 0x020F) || (c == 0x0211) || (c == 0x0213) || (c == 0x0215) || (c == 0x0217) || (c == 0x0219) || (c == 0x021B) || (c == 0x021D) || (c == 0x021F) || (c == 0x0221) || (c == 0x0223) || (c == 0x0225) || (c == 0x0227) || (c == 0x0229) || (c == 0x022B) || (c == 0x022D) || (c == 0x022F) || (c == 0x0231) || (c >= 0x0233 && c <= 0x0239) || (c == 0x023C) || (c >= 0x023F && c <= 0x0240) || (c == 0x0242) || (c == 0x0247) || (c == 0x0249) || (c == 0x024B) || (c == 0x024D) || (c >= 0x024F && c <= 0x0293) || (c >= 0x0295 && c <= 0x02AF) || (c == 0x0371) || (c == 0x0373) || (c == 0x0377) || (c >= 0x037B && c <= 0x037D) || (c == 0x0390) || (c >= 0x03AC && c <= 0x03CE) || (c >= 0x03D0 && c <= 0x03D1) || (c >= 0x03D5 && c <= 0x03D7) || (c == 0x03D9) || (c == 0x03DB) || (c == 0x03DD) || (c == 0x03DF) || (c == 0x03E1) || (c == 0x03E3) || (c == 0x03E5) || (c == 0x03E7) || (c == 0x03E9) || (c == 0x03EB) || (c == 0x03ED) || (c >= 0x03EF && c <= 0x03F3) || (c == 0x03F5) || (c == 0x03F8) || (c >= 0x03FB && c <= 0x03FC) || (c >= 0x0430 && c <= 0x045F) || (c == 0x0461) || (c == 0x0463) || (c == 0x0465) || (c == 0x0467) || (c == 0x0469) || (c == 0x046B) || (c == 0x046D) || (c == 0x046F) || (c == 0x0471) || (c == 0x0473) || (c == 0x0475) || (c == 0x0477) || (c == 0x0479) || (c == 0x047B) || (c == 0x047D) || (c == 0x047F) || (c == 0x0481) || (c == 0x048B) || (c == 0x048D) || (c == 0x048F) || (c == 0x0491) || (c == 0x0493) || (c == 0x0495) || (c == 0x0497) || (c == 0x0499) || (c == 0x049B) || (c == 0x049D) || (c == 0x049F) || (c == 0x04A1) || (c == 0x04A3) || (c == 0x04A5) || (c == 0x04A7) || (c == 0x04A9) || (c == 0x04AB) || (c == 0x04AD) || (c == 0x04AF) || (c == 0x04B1) || (c == 0x04B3) || (c == 0x04B5) || (c == 0x04B7) || (c == 0x04B9) || (c == 0x04BB) || (c == 0x04BD) || (c == 0x04BF) || (c == 0x04C2) || (c == 0x04C4) || (c == 0x04C6) || (c == 0x04C8) || (c == 0x04CA) || (c == 0x04CC) || (c >= 0x04CE && c <= 0x04CF) || (c == 0x04D1) || (c == 0x04D3) || (c == 0x04D5) || (c == 0x04D7) || (c == 0x04D9) || (c == 0x04DB) || (c == 0x04DD) || (c == 0x04DF) || (c == 0x04E1) || (c == 0x04E3) || (c == 0x04E5) || (c == 0x04E7) || (c == 0x04E9) || (c == 0x04EB) || (c == 0x04ED) || (c == 0x04EF) || (c == 0x04F1) || (c == 0x04F3) || (c == 0x04F5) || (c == 0x04F7) || (c == 0x04F9) || (c == 0x04FB) || (c == 0x04FD) || (c == 0x04FF) || (c == 0x0501) || (c == 0x0503) || (c == 0x0505) || (c == 0x0507) || (c == 0x0509) || (c == 0x050B) || (c == 0x050D) || (c == 0x050F) || (c == 0x0511) || (c == 0x0513) || (c == 0x0515) || (c == 0x0517) || (c == 0x0519) || (c == 0x051B) || (c == 0x051D) || (c == 0x051F) || (c == 0x0521) || (c == 0x0523) || (c >= 0x0561 && c <= 0x0587) || (c >= 0x1D00 && c <= 0x1D2B) || (c >= 0x1D62 && c <= 0x1D77) || (c >= 0x1D79 && c <= 0x1D9A) || (c == 0x1E01) || (c == 0x1E03) || (c == 0x1E05) || (c == 0x1E07) || (c == 0x1E09) || (c == 0x1E0B) || (c == 0x1E0D) || (c == 0x1E0F) || (c == 0x1E11) || (c == 0x1E13) || (c == 0x1E15) || (c == 0x1E17) || (c == 0x1E19) || (c == 0x1E1B) || (c == 0x1E1D) || (c == 0x1E1F) || (c == 0x1E21) || (c == 0x1E23) || (c == 0x1E25) || (c == 0x1E27) || (c == 0x1E29) || (c == 0x1E2B) || (c == 0x1E2D) || (c == 0x1E2F) || (c == 0x1E31) || (c == 0x1E33) || (c == 0x1E35) || (c == 0x1E37) || (c == 0x1E39) || (c == 0x1E3B) || (c == 0x1E3D) || (c == 0x1E3F) || (c == 0x1E41) || (c == 0x1E43) || (c == 0x1E45) || (c == 0x1E47) || (c == 0x1E49) || (c == 0x1E4B) || (c == 0x1E4D) || (c == 0x1E4F) || (c == 0x1E51) || (c == 0x1E53) || (c == 0x1E55) || (c == 0x1E57) || (c == 0x1E59) || (c == 0x1E5B) || (c == 0x1E5D) || (c == 0x1E5F) || (c == 0x1E61) || (c == 0x1E63) || (c == 0x1E65) || (c == 0x1E67) || (c == 0x1E69) || (c == 0x1E6B) || (c == 0x1E6D) || (c == 0x1E6F) || (c == 0x1E71) || (c == 0x1E73) || (c == 0x1E75) || (c == 0x1E77) || (c == 0x1E79) || (c == 0x1E7B) || (c == 0x1E7D) || (c == 0x1E7F) || (c == 0x1E81) || (c == 0x1E83) || (c == 0x1E85) || (c == 0x1E87) || (c == 0x1E89) || (c == 0x1E8B) || (c == 0x1E8D) || (c == 0x1E8F) || (c == 0x1E91) || (c == 0x1E93) || (c >= 0x1E95 && c <= 0x1E9D) || (c == 0x1E9F) || (c == 0x1EA1) || (c == 0x1EA3) || (c == 0x1EA5) || (c == 0x1EA7) || (c == 0x1EA9) || (c == 0x1EAB) || (c == 0x1EAD) || (c == 0x1EAF) || (c == 0x1EB1) || (c == 0x1EB3) || (c == 0x1EB5) || (c == 0x1EB7) || (c == 0x1EB9) || (c == 0x1EBB) || (c == 0x1EBD) || (c == 0x1EBF) || (c == 0x1EC1) || (c == 0x1EC3) || (c == 0x1EC5) || (c == 0x1EC7) || (c == 0x1EC9) || (c == 0x1ECB) || (c == 0x1ECD) || (c == 0x1ECF) || (c == 0x1ED1) || (c == 0x1ED3) || (c == 0x1ED5) || (c == 0x1ED7) || (c == 0x1ED9) || (c == 0x1EDB) || (c == 0x1EDD) || (c == 0x1EDF) || (c == 0x1EE1) || (c == 0x1EE3) || (c == 0x1EE5) || (c == 0x1EE7) || (c == 0x1EE9) || (c == 0x1EEB) || (c == 0x1EED) || (c == 0x1EEF) || (c == 0x1EF1) || (c == 0x1EF3) || (c == 0x1EF5) || (c == 0x1EF7) || (c == 0x1EF9) || (c == 0x1EFB) || (c == 0x1EFD) || (c >= 0x1EFF && c <= 0x1F07) || (c >= 0x1F10 && c <= 0x1F15) || (c >= 0x1F20 && c <= 0x1F27) || (c >= 0x1F30 && c <= 0x1F37) || (c >= 0x1F40 && c <= 0x1F45) || (c >= 0x1F50 && c <= 0x1F57) || (c >= 0x1F60 && c <= 0x1F67) || (c >= 0x1F70 && c <= 0x1F7D) || (c >= 0x1F80 && c <= 0x1F87) || (c >= 0x1F90 && c <= 0x1F97) || (c >= 0x1FA0 && c <= 0x1FA7) || (c >= 0x1FB0 && c <= 0x1FB4) || (c >= 0x1FB6 && c <= 0x1FB7) || (c == 0x1FBE) || (c >= 0x1FC2 && c <= 0x1FC4) || (c >= 0x1FC6 && c <= 0x1FC7) || (c >= 0x1FD0 && c <= 0x1FD3) || (c >= 0x1FD6 && c <= 0x1FD7) || (c >= 0x1FE0 && c <= 0x1FE7) || (c >= 0x1FF2 && c <= 0x1FF4) || (c >= 0x1FF6 && c <= 0x1FF7) || (c == 0x2071) || (c == 0x207F) || (c == 0x210A) || (c >= 0x210E && c <= 0x210F) || (c == 0x2113) || (c == 0x212F) || (c == 0x2134) || (c == 0x2139) || (c >= 0x213C && c <= 0x213D) || (c >= 0x2146 && c <= 0x2149) || (c == 0x214E) || (c == 0x2184) || (c >= 0x2C30 && c <= 0x2C5E) || (c == 0x2C61) || (c >= 0x2C65 && c <= 0x2C66) || (c == 0x2C68) || (c == 0x2C6A) || (c == 0x2C6C) || (c == 0x2C71) || (c >= 0x2C73 && c <= 0x2C74) || (c >= 0x2C76 && c <= 0x2C7C) || (c == 0x2C81) || (c == 0x2C83) || (c == 0x2C85) || (c == 0x2C87) || (c == 0x2C89) || (c == 0x2C8B) || (c == 0x2C8D) || (c == 0x2C8F) || (c == 0x2C91) || (c == 0x2C93) || (c == 0x2C95) || (c == 0x2C97) || (c == 0x2C99) || (c == 0x2C9B) || (c == 0x2C9D) || (c == 0x2C9F) || (c == 0x2CA1) || (c == 0x2CA3) || (c == 0x2CA5) || (c == 0x2CA7) || (c == 0x2CA9) || (c == 0x2CAB) || (c == 0x2CAD) || (c == 0x2CAF) || (c == 0x2CB1) || (c == 0x2CB3) || (c == 0x2CB5) || (c == 0x2CB7) || (c == 0x2CB9) || (c == 0x2CBB) || (c == 0x2CBD) || (c == 0x2CBF) || (c == 0x2CC1) || (c == 0x2CC3) || (c == 0x2CC5) || (c == 0x2CC7) || (c == 0x2CC9) || (c == 0x2CCB) || (c == 0x2CCD) || (c == 0x2CCF) || (c == 0x2CD1) || (c == 0x2CD3) || (c == 0x2CD5) || (c == 0x2CD7) || (c == 0x2CD9) || (c == 0x2CDB) || (c == 0x2CDD) || (c == 0x2CDF) || (c == 0x2CE1) || (c >= 0x2CE3 && c <= 0x2CE4) || (c >= 0x2D00 && c <= 0x2D25) || (c == 0xA641) || (c == 0xA643) || (c == 0xA645) || (c == 0xA647) || (c == 0xA649) || (c == 0xA64B) || (c == 0xA64D) || (c == 0xA64F) || (c == 0xA651) || (c == 0xA653) || (c == 0xA655) || (c == 0xA657) || (c == 0xA659) || (c == 0xA65B) || (c == 0xA65D) || (c == 0xA65F) || (c == 0xA663) || (c == 0xA665) || (c == 0xA667) || (c == 0xA669) || (c == 0xA66B) || (c == 0xA66D) || (c == 0xA681) || (c == 0xA683) || (c == 0xA685) || (c == 0xA687) || (c == 0xA689) || (c == 0xA68B) || (c == 0xA68D) || (c == 0xA68F) || (c == 0xA691) || (c == 0xA693) || (c == 0xA695) || (c == 0xA697) || (c == 0xA723) || (c == 0xA725) || (c == 0xA727) || (c == 0xA729) || (c == 0xA72B) || (c == 0xA72D) || (c >= 0xA72F && c <= 0xA731) || (c == 0xA733) || (c == 0xA735) || (c == 0xA737) || (c == 0xA739) || (c == 0xA73B) || (c == 0xA73D) || (c == 0xA73F) || (c == 0xA741) || (c == 0xA743) || (c == 0xA745) || (c == 0xA747) || (c == 0xA749) || (c == 0xA74B) || (c == 0xA74D) || (c == 0xA74F) || (c == 0xA751) || (c == 0xA753) || (c == 0xA755) || (c == 0xA757) || (c == 0xA759) || (c == 0xA75B) || (c == 0xA75D) || (c == 0xA75F) || (c == 0xA761) || (c == 0xA763) || (c == 0xA765) || (c == 0xA767) || (c == 0xA769) || (c == 0xA76B) || (c == 0xA76D) || (c == 0xA76F) || (c >= 0xA771 && c <= 0xA778) || (c == 0xA77A) || (c == 0xA77C) || (c == 0xA77F) || (c == 0xA781) || (c == 0xA783) || (c == 0xA785) || (c == 0xA787) || (c == 0xA78C) || (c >= 0xFB00 && c <= 0xFB06) || (c >= 0xFB13 && c <= 0xFB17) || (c >= 0xFF41 && c <= 0xFF5A) || (c >= 0x10428 && c <= 0x1044F) || (c >= 0x1D41A && c <= 0x1D433) || (c >= 0x1D44E && c <= 0x1D454) || (c >= 0x1D456 && c <= 0x1D467) || (c >= 0x1D482 && c <= 0x1D49B) || (c >= 0x1D4B6 && c <= 0x1D4B9) || (c == 0x1D4BB) || (c >= 0x1D4BD && c <= 0x1D4C3) || (c >= 0x1D4C5 && c <= 0x1D4CF) || (c >= 0x1D4EA && c <= 0x1D503) || (c >= 0x1D51E && c <= 0x1D537) || (c >= 0x1D552 && c <= 0x1D56B) || (c >= 0x1D586 && c <= 0x1D59F) || (c >= 0x1D5BA && c <= 0x1D5D3) || (c >= 0x1D5EE && c <= 0x1D607) || (c >= 0x1D622 && c <= 0x1D63B) || (c >= 0x1D656 && c <= 0x1D66F) || (c >= 0x1D68A && c <= 0x1D6A5) || (c >= 0x1D6C2 && c <= 0x1D6DA) || (c >= 0x1D6DC && c <= 0x1D6E1) || (c >= 0x1D6FC && c <= 0x1D714) || (c >= 0x1D716 && c <= 0x1D71B) || (c >= 0x1D736 && c <= 0x1D74E) || (c >= 0x1D750 && c <= 0x1D755) || (c >= 0x1D770 && c <= 0x1D788) || (c >= 0x1D78A && c <= 0x1D78F) || (c >= 0x1D7AA && c <= 0x1D7C2) || (c >= 0x1D7C4 && c <= 0x1D7C9) || (c == 0x1D7CB)) 
		return LL;
	else if ((c == 0x01BB) || (c >= 0x01C0 && c <= 0x01C3) || (c == 0x0294) || (c >= 0x05D0 && c <= 0x05EA) || (c >= 0x05F0 && c <= 0x05F2) || (c >= 0x0621 && c <= 0x063F) || (c >= 0x0641 && c <= 0x064A) || (c >= 0x066E && c <= 0x066F) || (c >= 0x0671 && c <= 0x06D3) || (c == 0x06D5) || (c >= 0x06EE && c <= 0x06EF) || (c >= 0x06FA && c <= 0x06FC) || (c == 0x06FF) || (c == 0x0710) || (c >= 0x0712 && c <= 0x072F) || (c >= 0x074D && c <= 0x07A5) || (c == 0x07B1) || (c >= 0x07CA && c <= 0x07EA) || (c >= 0x0904 && c <= 0x0939) || (c == 0x093D) || (c == 0x0950) || (c >= 0x0958 && c <= 0x0961) || (c == 0x0972) || (c >= 0x097B && c <= 0x097F) || (c >= 0x0985 && c <= 0x098C) || (c >= 0x098F && c <= 0x0990) || (c >= 0x0993 && c <= 0x09A8) || (c >= 0x09AA && c <= 0x09B0) || (c == 0x09B2) || (c >= 0x09B6 && c <= 0x09B9) || (c == 0x09BD) || (c == 0x09CE) || (c >= 0x09DC && c <= 0x09DD) || (c >= 0x09DF && c <= 0x09E1) || (c >= 0x09F0 && c <= 0x09F1) || (c >= 0x0A05 && c <= 0x0A0A) || (c >= 0x0A0F && c <= 0x0A10) || (c >= 0x0A13 && c <= 0x0A28) || (c >= 0x0A2A && c <= 0x0A30) || (c >= 0x0A32 && c <= 0x0A33) || (c >= 0x0A35 && c <= 0x0A36) || (c >= 0x0A38 && c <= 0x0A39) || (c >= 0x0A59 && c <= 0x0A5C) || (c == 0x0A5E) || (c >= 0x0A72 && c <= 0x0A74) || (c >= 0x0A85 && c <= 0x0A8D) || (c >= 0x0A8F && c <= 0x0A91) || (c >= 0x0A93 && c <= 0x0AA8) || (c >= 0x0AAA && c <= 0x0AB0) || (c >= 0x0AB2 && c <= 0x0AB3) || (c >= 0x0AB5 && c <= 0x0AB9) || (c == 0x0ABD) || (c == 0x0AD0) || (c >= 0x0AE0 && c <= 0x0AE1) || (c >= 0x0B05 && c <= 0x0B0C) || (c >= 0x0B0F && c <= 0x0B10) || (c >= 0x0B13 && c <= 0x0B28) || (c >= 0x0B2A && c <= 0x0B30) || (c >= 0x0B32 && c <= 0x0B33) || (c >= 0x0B35 && c <= 0x0B39) || (c == 0x0B3D) || (c >= 0x0B5C && c <= 0x0B5D) || (c >= 0x0B5F && c <= 0x0B61) || (c == 0x0B71) || (c == 0x0B83) || (c >= 0x0B85 && c <= 0x0B8A) || (c >= 0x0B8E && c <= 0x0B90) || (c >= 0x0B92 && c <= 0x0B95) || (c >= 0x0B99 && c <= 0x0B9A) || (c == 0x0B9C) || (c >= 0x0B9E && c <= 0x0B9F) || (c >= 0x0BA3 && c <= 0x0BA4) || (c >= 0x0BA8 && c <= 0x0BAA) || (c >= 0x0BAE && c <= 0x0BB9) || (c == 0x0BD0) || (c >= 0x0C05 && c <= 0x0C0C) || (c >= 0x0C0E && c <= 0x0C10) || (c >= 0x0C12 && c <= 0x0C28) || (c >= 0x0C2A && c <= 0x0C33) || (c >= 0x0C35 && c <= 0x0C39) || (c == 0x0C3D) || (c >= 0x0C58 && c <= 0x0C59) || (c >= 0x0C60 && c <= 0x0C61) || (c >= 0x0C85 && c <= 0x0C8C) || (c >= 0x0C8E && c <= 0x0C90) || (c >= 0x0C92 && c <= 0x0CA8) || (c >= 0x0CAA && c <= 0x0CB3) || (c >= 0x0CB5 && c <= 0x0CB9) || (c == 0x0CBD) || (c == 0x0CDE) || (c >= 0x0CE0 && c <= 0x0CE1) || (c >= 0x0D05 && c <= 0x0D0C) || (c >= 0x0D0E && c <= 0x0D10) || (c >= 0x0D12 && c <= 0x0D28) || (c >= 0x0D2A && c <= 0x0D39) || (c == 0x0D3D) || (c >= 0x0D60 && c <= 0x0D61) || (c >= 0x0D7A && c <= 0x0D7F) || (c >= 0x0D85 && c <= 0x0D96) || (c >= 0x0D9A && c <= 0x0DB1) || (c >= 0x0DB3 && c <= 0x0DBB) || (c == 0x0DBD) || (c >= 0x0DC0 && c <= 0x0DC6) || (c >= 0x0E01 && c <= 0x0E30) || (c >= 0x0E32 && c <= 0x0E33) || (c >= 0x0E40 && c <= 0x0E45) || (c >= 0x0E81 && c <= 0x0E82) || (c == 0x0E84) || (c >= 0x0E87 && c <= 0x0E88) || (c == 0x0E8A) || (c == 0x0E8D) || (c >= 0x0E94 && c <= 0x0E97) || (c >= 0x0E99 && c <= 0x0E9F) || (c >= 0x0EA1 && c <= 0x0EA3) || (c == 0x0EA5) || (c == 0x0EA7) || (c >= 0x0EAA && c <= 0x0EAB) || (c >= 0x0EAD && c <= 0x0EB0) || (c >= 0x0EB2 && c <= 0x0EB3) || (c == 0x0EBD) || (c >= 0x0EC0 && c <= 0x0EC4) || (c >= 0x0EDC && c <= 0x0EDD) || (c == 0x0F00) || (c >= 0x0F40 && c <= 0x0F47) || (c >= 0x0F49 && c <= 0x0F6C) || (c >= 0x0F88 && c <= 0x0F8B) || (c >= 0x1000 && c <= 0x102A) || (c == 0x103F) || (c >= 0x1050 && c <= 0x1055) || (c >= 0x105A && c <= 0x105D) || (c == 0x1061) || (c >= 0x1065 && c <= 0x1066) || (c >= 0x106E && c <= 0x1070) || (c >= 0x1075 && c <= 0x1081) || (c == 0x108E) || (c >= 0x10D0 && c <= 0x10FA) || (c >= 0x1100 && c <= 0x1159) || (c >= 0x115F && c <= 0x11A2) || (c >= 0x11A8 && c <= 0x11F9) || (c >= 0x1200 && c <= 0x1248) || (c >= 0x124A && c <= 0x124D) || (c >= 0x1250 && c <= 0x1256) || (c == 0x1258) || (c >= 0x125A && c <= 0x125D) || (c >= 0x1260 && c <= 0x1288) || (c >= 0x128A && c <= 0x128D) || (c >= 0x1290 && c <= 0x12B0) || (c >= 0x12B2 && c <= 0x12B5) || (c >= 0x12B8 && c <= 0x12BE) || (c == 0x12C0) || (c >= 0x12C2 && c <= 0x12C5) || (c >= 0x12C8 && c <= 0x12D6) || (c >= 0x12D8 && c <= 0x1310) || (c >= 0x1312 && c <= 0x1315) || (c >= 0x1318 && c <= 0x135A) || (c >= 0x1380 && c <= 0x138F) || (c >= 0x13A0 && c <= 0x13F4) || (c >= 0x1401 && c <= 0x166C) || (c >= 0x166F && c <= 0x1676) || (c >= 0x1681 && c <= 0x169A) || (c >= 0x16A0 && c <= 0x16EA) || (c >= 0x1700 && c <= 0x170C) || (c >= 0x170E && c <= 0x1711) || (c >= 0x1720 && c <= 0x1731) || (c >= 0x1740 && c <= 0x1751) || (c >= 0x1760 && c <= 0x176C) || (c >= 0x176E && c <= 0x1770) || (c >= 0x1780 && c <= 0x17B3) || (c == 0x17DC) || (c >= 0x1820 && c <= 0x1842) || (c >= 0x1844 && c <= 0x1877) || (c >= 0x1880 && c <= 0x18A8) || (c == 0x18AA) || (c >= 0x1900 && c <= 0x191C) || (c >= 0x1950 && c <= 0x196D) || (c >= 0x1970 && c <= 0x1974) || (c >= 0x1980 && c <= 0x19A9) || (c >= 0x19C1 && c <= 0x19C7) || (c >= 0x1A00 && c <= 0x1A16) || (c >= 0x1B05 && c <= 0x1B33) || (c >= 0x1B45 && c <= 0x1B4B) || (c >= 0x1B83 && c <= 0x1BA0) || (c >= 0x1BAE && c <= 0x1BAF) || (c >= 0x1C00 && c <= 0x1C23) || (c >= 0x1C4D && c <= 0x1C4F) || (c >= 0x1C5A && c <= 0x1C77) || (c >= 0x2135 && c <= 0x2138) || (c >= 0x2D30 && c <= 0x2D65) || (c >= 0x2D80 && c <= 0x2D96) || (c >= 0x2DA0 && c <= 0x2DA6) || (c >= 0x2DA8 && c <= 0x2DAE) || (c >= 0x2DB0 && c <= 0x2DB6) || (c >= 0x2DB8 && c <= 0x2DBE) || (c >= 0x2DC0 && c <= 0x2DC6) || (c >= 0x2DC8 && c <= 0x2DCE) || (c >= 0x2DD0 && c <= 0x2DD6) || (c >= 0x2DD8 && c <= 0x2DDE) || (c == 0x3006) || (c == 0x303C) || (c >= 0x3041 && c <= 0x3096) || (c == 0x309F) || (c >= 0x30A1 && c <= 0x30FA) || (c == 0x30FF) || (c >= 0x3105 && c <= 0x312D) || (c >= 0x3131 && c <= 0x318E) || (c >= 0x31A0 && c <= 0x31B7) || (c >= 0x31F0 && c <= 0x31FF) || (c >= 0x3400 && c <= 0x4DB5) || (c >= 0x4E00 && c <= 0x9FC3) || (c >= 0xA000 && c <= 0xA014) || (c >= 0xA016 && c <= 0xA48C) || (c >= 0xA500 && c <= 0xA60B) || (c >= 0xA610 && c <= 0xA61F) || (c >= 0xA62A && c <= 0xA62B) || (c == 0xA66E) || (c >= 0xA7FB && c <= 0xA801) || (c >= 0xA803 && c <= 0xA805) || (c >= 0xA807 && c <= 0xA80A) || (c >= 0xA80C && c <= 0xA822) || (c >= 0xA840 && c <= 0xA873) || (c >= 0xA882 && c <= 0xA8B3) || (c >= 0xA90A && c <= 0xA925) || (c >= 0xA930 && c <= 0xA946) || (c >= 0xAA00 && c <= 0xAA28) || (c >= 0xAA40 && c <= 0xAA42) || (c >= 0xAA44 && c <= 0xAA4B) || (c >= 0xAC00 && c <= 0xD7A3) || (c >= 0xF900 && c <= 0xFA2D) || (c >= 0xFA30 && c <= 0xFA6A) || (c >= 0xFA70 && c <= 0xFAD9) || (c == 0xFB1D) || (c >= 0xFB1F && c <= 0xFB28) || (c >= 0xFB2A && c <= 0xFB36) || (c >= 0xFB38 && c <= 0xFB3C) || (c == 0xFB3E) || (c >= 0xFB40 && c <= 0xFB41) || (c >= 0xFB43 && c <= 0xFB44) || (c >= 0xFB46 && c <= 0xFBB1) || (c >= 0xFBD3 && c <= 0xFD3D) || (c >= 0xFD50 && c <= 0xFD8F) || (c >= 0xFD92 && c <= 0xFDC7) || (c >= 0xFDF0 && c <= 0xFDFB) || (c >= 0xFE70 && c <= 0xFE74) || (c >= 0xFE76 && c <= 0xFEFC) || (c >= 0xFF66 && c <= 0xFF6F) || (c >= 0xFF71 && c <= 0xFF9D) || (c >= 0xFFA0 && c <= 0xFFBE) || (c >= 0xFFC2 && c <= 0xFFC7) || (c >= 0xFFCA && c <= 0xFFCF) || (c >= 0xFFD2 && c <= 0xFFD7) || (c >= 0xFFDA && c <= 0xFFDC) || (c >= 0x10000 && c <= 0x1000B) || (c >= 0x1000D && c <= 0x10026) || (c >= 0x10028 && c <= 0x1003A) || (c >= 0x1003C && c <= 0x1003D) || (c >= 0x1003F && c <= 0x1004D) || (c >= 0x10050 && c <= 0x1005D) || (c >= 0x10080 && c <= 0x100FA) || (c >= 0x10280 && c <= 0x1029C) || (c >= 0x102A0 && c <= 0x102D0) || (c >= 0x10300 && c <= 0x1031E) || (c >= 0x10330 && c <= 0x10340) || (c >= 0x10342 && c <= 0x10349) || (c >= 0x10380 && c <= 0x1039D) || (c >= 0x103A0 && c <= 0x103C3) || (c >= 0x103C8 && c <= 0x103CF) || (c >= 0x10450 && c <= 0x1049D) || (c >= 0x10800 && c <= 0x10805) || (c == 0x10808) || (c >= 0x1080A && c <= 0x10835) || (c >= 0x10837 && c <= 0x10838) || (c == 0x1083C) || (c == 0x1083F) || (c >= 0x10900 && c <= 0x10915) || (c >= 0x10920 && c <= 0x10939) || (c == 0x10A00) || (c >= 0x10A10 && c <= 0x10A13) || (c >= 0x10A15 && c <= 0x10A17) || (c >= 0x10A19 && c <= 0x10A33) || (c >= 0x12000 && c <= 0x1236E) || (c >= 0x20000 && c <= 0x2A6D6) || (c >= 0x2F800 && c <= 0x2FA1D)) 
		return LO;
	else if ((c >= 0x0488 && c <= 0x0489) || (c == 0x06DE) || (c >= 0x20DD && c <= 0x20E0) || (c >= 0x20E2 && c <= 0x20E4) || (c >= 0xA670 && c <= 0xA672)) 
		return ME;
	else if ((c == 0x2029)) 
		return ZP;
	else if ((c == 0x00BB) || (c == 0x2019) || (c == 0x201D) || (c == 0x203A) || (c == 0x2E03) || (c == 0x2E05) || (c == 0x2E0A) || (c == 0x2E0D) || (c == 0x2E1D) || (c == 0x2E21)) 
		return PF;
	else if ((c >= 0xD800 && c <= 0xDFFF)) 
		return CS;
	else //if ((c == 0x002D) || (c == 0x058A) || (c == 0x05BE) || (c == 0x1806) || (c >= 0x2010 && c <= 0x2015) || (c == 0x2E17) || (c == 0x2E1A) || (c == 0x301C) || (c == 0x3030) || (c == 0x30A0) || (c >= 0xFE31 && c <= 0xFE32) || (c == 0xFE58) || (c == 0xFE63) || (c == 0xFF0D)) 
		return PD;
}

/* Compare n characters of two UTF-8 strings. */
bool compareCharacters(utf8* first, utf8* second, unsigned int length)
{
	// Loop through characters, comparing them
	for (unsigned int i = 0; i < length; i++) {
		if (first[i] != second[i])
			return false;
	}

	// If we got to here then all characters match
	return true;
}

/* Compare n characters of two UTF-16 strings. */
bool compareCharacters(utf16* first, utf16* second, unsigned int length)
{
	// Loop through characters, comparing them
	for (unsigned int i = 0; i < length; i++) {
		if (first[i] != second[i])
			return false;
	}

	// If we got to here then all characters match
	return true;
}

/* Decodes a UTF-8 character into a UTF-32 character. */
utf32 decodeCharacter(utf8*& characters)
{

}

/* Decodes a UTF-16 character into a UTF-32 character. */
utf32 decodeCharacter(utf16*& characters)
{
	// Check for invalid surrogate
	if (isSecondSurrogate(*characters))
		return 0;

	// Check for valid starting surrogate
	else if (isFirstSurrogate(*characters)) {
		// Check for valid second surrogate character
		if (isSecondSurrogate(*(characters + 1))) {
			utf32 decoded = 0x10000 + ((*characters - 0xd800) << 10) + 
							(*(characters + 1) - 0xdc00);
			return decoded;
		}

		// Or else return zero
		else
			return 0;
	}

	else
		return (utf32) *characters;
}

/* Decrement pointer to UTF-8 string. */
void decrementPointer(utf8*& string)
{
	
}

/* Decrement pointer to UTF-16 string. */
void decrementPointer(utf16*& string)
{
	// This is required for UTF-16. Otherwise we would be just parsing UCS-2.
	if (isSecondSurrogate(*(string-1)))
		string -= 2;
	else
		string--;
}

/* Increment pointer to UTF-8 string. */
void incrementPointer(utf8*& string)
{
	
}

/* Increment pointer to UTF-16 string. */
void incrementPointer(utf16*& string)
{
	// This is required for UTF-16. Otherwise we would be just parsing UCS-2.
	if (isFirstSurrogate(*string))
		string += 2;
	else
		string++;
}

// NOTE: *** CONTINUE FROM HERE NEXT TIME 10-7-2011 ***
// NOTE: Keep reordering functions.

/* Subclassfies (grouping similar categories together) a UTF-32 character. */
GeneralCategory subclassifyCharacter(utf32 character)
{
	// Get the general category
	GeneralCategory category = classifyCharacter(character);

	// Group categories into sub-categories and return result
	if (category >= 0 && category <= 4)
		return LETTER;
	else if (category >= 5 && category <= 7)
		return MARK;
	else if (category >= 8 && category <= 10)
		return NUMBER;
	else if (category >= 11 && category <= 17)
		return PUNCTUATION;
	else if (category >= 18 && category <= 21)
		return SYMBOL;
	else if (category >= 22 && category <= 24)
		return SEPARATOR;
	else
		return OTHER;
}

/* Determine if new line present and if so then update position. */
bool isNewLine(utf16*& position, utf16* final)
{
	// If no characters to search then return false
	if (position == final)
		return false;

	// Check for one length new-line characters
	if (*position == 0x0a || *position == 0x085 || *position == 0x0c ||
		*position == 0x2028 || *position == 0x2029) {
		// Increment position and return true
		position++;
		return true;
	}

	// Check for possible two character new-line
	else if (*position == 0x0d) {
		position++;

		// If we have reached the end of string then return true
		if (position == final)
			return true;

		// Otherwise check if there is a successive line feed
		else if (*position == 0x0a)
			position++;
		
		return true;
	}

	// If we get to here then no new line present
	return false;
}

/* Determine if character is white space. */
bool isWhitespace(utf32 c)
{
	if ((c >= 0x09 && c <= 0x0d) || c == 0x20 || c == 0x85 || c == 0xa0 || 
		c == 0x1680 || c == 0x180e || (c >= 0x2000 && c <= 0x200a) || 
		c == 0x2028 || c == 0x2029 || c == 0x202f || c == 0x205f || c == 0x3000)
		return true;
	else
		return false;
}

/* Calculate size in bytes of utf16 string. */
// TODO: Fix this function so that it works for strings with 3 byte characters
// TODO: Return 0 if an invalid character is detected
unsigned int sizeString(utf16* string)
{
	// Each character is two bytes
	return lengthString(string) * sizeof(utf16);
}

/* Calculate length in code points of utf16 string. */
unsigned int lengthString(utf16* string)
{
	// Calculate size
	unsigned int i = 0;
	for (unsigned int i = 0;; i++) {
		if (*string++ == 0)
			return i;
	}
}

/* Calculate length in characters of utf16 string. */
// TODO: Return -1 if an invalid character is detected.
unsigned int charsString(utf16* string)
{
	unsigned int chars = 0;
	while (*string) {
		// Check to see if surrogate. Ignore invalid surrogates.
		if (isFirstSurrogate(*string) && isSecondSurrogate(*(string + 1)))
			string++;

		// Go to next code point
		chars++;
		string++;
	}

	return chars;
}

/*! Check if character is valid UTF-16, that is, check surrogate pairs. */
bool isValidCharacter(utf16* position, utf16* final)
{
	// Check to see that we have characters
	if (position == final)
		return false;

	// Check for invalid surrogate
	if (isSecondSurrogate(*position))
		return false;

	// Check for valid starting surrogate
	else if (isFirstSurrogate(*position)) {
		// Check that we have another character available
		if (position + 1 == final)
			return false;

		// Check for valid second surrogate character
		if (isSecondSurrogate(*(position + 1)))
			return true;

		// Or else return zero
		else
			return false;
	}

	else
		return true;
}

/* Detect if character is first half of a surrogate pair */
bool isFirstSurrogate(utf16 character)
{
	if (character >= 0xd800 && character <= 0xdbff)
		return true;
	else
		return false;
}

/* Detect if character is second half of a surrogate pair */
bool isSecondSurrogate(utf16 character)
{
	if (character >= 0xdc00 && character <= 0xdfff)
		return true;
	else
		return false;
}

/* Keep incrementing pointer until skipped white space. */
void skipWhitespace(utf16*& string)
{
	// While we still have whitespace, increment pointer
	while (*string && isWhitespace(decodeCharacter(string)))
		incrementPointer(string);
}

/* Keep incrementing pointer until next scalar is reached. */
bool nextScalar(utf16*& string)
{
	// Skip until the next scalar
	if (!skipScalar(string))
		return false;

	// Skip the separator
	return skipSeparator(string);
}

/* Increment pointer until skipped separator (comma and whitespace) .*/
bool skipSeparator(utf16*& string)
{ 
	// Skip comma and whitespace
	bool hasComma = false;
	while (*string == L',' || isWhitespace(*string)) {
		// We can only have one comma in a separator
		if (*string == L',') {
			if (hasComma)
				return true;
			hasComma = true;
		}

		// Otherwise, if not whitespace then separator has finished
		else if (!isWhitespace(*string))
			break;

		string++;
	}

	// Return true or false depending on whether we have found end of string
	if (!*string)
		return false;
	else
		return true;
}

/* Increment pointer until skipped scalar (assuming it is valid) */
bool skipScalar(utf16*& string)
{
	// Skip until a separator character encountered
	while (*string != L',' && !isWhitespace(*string)) {
		// See if we reached end of string
		if (!*string)
			return false;
		string++;
	}
	return true;
}

/* Test if string contains valid scalar. Update pointer past scalar. */
bool isValidScalar(utf16*& string)
{
	// We will look for some digits
	bool hasDigits = false, hasPoint = false;

	// Skip past + or - sign
	if (*string == L'+' || *string == L'-')
		string++;

	// Skip past digits
	while (true) {
		// If this character is a digit then make note of that
		if (*string >= L'0' && *string <= L'9') {
			hasDigits = true;
			string++;
		}

		// Test for decimal point
		else if (*string == L'.') {
			// We can't have two decimal points in here
			if (hasPoint) {
				(error << L"Scalar contains more than one decimal point.").warning();
				return false;
			}

			// Otherwise make a note of it
			else {
				hasPoint = true;
				string++;
			}
		}

		// If e or E then we have an exponent
		else if (*string == L'e' || *string == L'E') {
			string++;
			if (!hasDigits) {
				(error << L"Scalar does not contain any digits.").warning();
				return false;
			}
			else
				break;
		}

		// If end of string, whitespace, or comma then end of scalar
		else if (!*string) {
			if (!hasDigits) {
				(error << L"Scalar does not contain any digits.").warning();
				return false;
			}
			else
				return true;
		}

		else if (*string == L',' || isWhitespace(*string)) {
			if (!hasDigits) {
				(error << L"Scalar does not contain any digits.").warning();
				return false;
			}
			else {
				string++;
				return true;
			}
		}

		// Otherwise, contains an invalid character
		else {
			(error << L"Scalar contains invalid character(s).").warning();
			return false;
		}
	}

	// Skip past + or - sign
	if (*string == L'+' || *string == L'-')
		string++;

	// Skip past digits
	hasDigits = false;
	while (true) {
		// If this character is a digit then make note of that
		if (*string >= L'0' && *string <= L'9') {
			hasDigits = true;
			string++;
		}

		// If end of string then end of scalar
		else if (!*string) {
			if (!hasDigits) {
				(error << L"Exponent of scalar does not contain any digits.").warning();
				return false;
			}
			else
				return true;
		}

		// If whitespace, or comma then end of scalar
		else if (*string == L',' || isWhitespace(*string)) {
			if (!hasDigits) {
				(error << L"Exponent of scalar does not contain any digits.").warning();
				return false;
			}
			else {
				string++;
				return true;
			}
		}

		// Otherwise, contains an invalid character
		else {
			(error << L"Scalar contains invalid character(s).").warning();
			return false;
		}

	}
}

/* Test if string contains valid unsigned integer. Update pointer past integer. */
bool isValidInteger(utf16*& string)
{
	// We will look for some digits
	bool hasDigits = false;

	// Skip past digits
	while (true) {
		// If this character is a digit then make note of that
		if (*string >= L'0' && *string <= L'9') {
			hasDigits = true;
			string++;
		}

		// If end of string then end of integer
		else if (!*string) {
			if (!hasDigits) {
				(error << L"Integer does not contain any digits.").warning();
				return false;
			}
			else
				return true;
		}

		// If whitespace, or comma then end of integer
		else if (*string == L',' || isWhitespace(*string)) {
			if (!hasDigits) {
				(error << L"Integer does not contain any digits.").warning();
				return false;
			}
			else {
				string++;
				return true;
			}
		}

		// Otherwise, contains an invalid character
		else {
			(error << L"Integer contains invalid character(s).").warning();
			return false;
		}
	}
}

/* Convert UTF-16 string to unsigned integer. */
bool toUnsignedInteger(utf16* input, unsigned int& output)
{
	// *** CONTINUE FROM HERE 30/7/2011
	return true;
}

/* Convert UTF-16 string to signed integer. */
bool toInteger(utf16* input, int& output)
{

	return true;
}

/* Convert UTF-16 string to single precision floating number. */
bool toFloat(utf16* input, float& output)
{

	return true;
}

/* Convert UTF-16 string to double precision floating number. */
bool toFloat(utf16* input, double output)
{

	return true;
}

/* Convert UTF-8 string to UTF-16 string. */
bool toString(utf8* input, utf16* output)
{

	return true;
}

/* Convert signed 8-bit integer to UTF-16 string. */
bool toString(char input, utf16* output)
{
	return true;
}

/* Convert unsigned 8-bit integer to UTF-16 string. */
bool toString(unsigned char input, utf16* output)
{
	return true;
}

/* Convert signed 16-bit integer to UTF-16 string. */
bool toString(short input, utf16* output)
{
	return true;
}

/* Convert unsigned 16-bit integer UTF-16 string. */
bool toString(unsigned short input, utf16* output)
{
	return true;
}

/* Convert signed 32-bit integer to UTF-16 string. */
bool toString(int input, utf16* output)
{
	return true;
}

/* Convert unsigned 32-bit integer to UTF-16 string. */
bool toString(unsigned int input, utf16* output)
{
	return true;
}

/* Convert signed 64-bit integer to UTF-16 string. */
bool toString(long long input, utf16* output)
{
	return true;
}

/* Convert unsigned 64-bit integer to UTF-16 string. */
bool toString(unsigned long long input, utf16* output)
{
	return true;
}

/* Convert single precision floating number to UTF-16 string. */
bool toString(float input, utf16* output)
{
	return true;
}

/* Convert double precision floating number to UTF-16 string. */
bool toString(double input, utf16* output)
{
	return true;
}

/* Convert pointer to UTF-16 string. */
bool toString(void* input, utf16* output)
{
	return true;
}